Synchronized normal method 相当于
Synchronized statement(使用这个)
class A {
public synchronized void methodA() {
// all function code
}
equivalent to
public void methodA() {
synchronized(this) {
// all function code
}
}
}
Synchronized static method 等价于Synchronized statement(使用类)
class A {
public static synchronized void methodA() {
// all function code
}
equivalent to
public void methodA() {
synchronized(A.class) {
// all function code
}
}
}
同步语句(使用变量)
class A {
private Object lock1 = new Object();
public void methodA() {
synchronized(lock1 ) {
// all function code
}
}
}
对于synchronized,我们同时拥有Synchronized Methods 和Synchronized Statements。但是Synchronized Methods和Synchronized Statements很相似,所以我们只需要了解Synchronized Statements就可以了。
=> 基本上,我们会有
synchronized(object or class) { // object/class use to provides the intrinsic lock
// code
}
这里有2个想法,有助于理解synchronized
- 每个对象/类都有一个与之关联的
intrinsic lock。
- 当线程调用
synchronized statement 时,它会自动获取该synchronized statement's 对象的intrinsic lock,并在方法返回时释放它。只要一个线程拥有intrinsic lock,没有其他线程可以获得SAME锁=>线程安全。
=>
当thread A 调用synchronized(this){// code 1} => 具有synchronized(this) 和所有synchronized normal method(类内)的所有块代码(类内)被锁定,因为SAME 锁定。它将在thread A unlock(“// code 1”完成)后执行。
此行为类似于synchronized(a variable){// code 1} 或synchronized(class)。
SAME LOCK => 锁(不依赖于哪个方法?或者哪个语句?)
使用同步方法还是同步语句?
我更喜欢synchronized statements,因为它更具可扩展性。例如,以后只需要同步一部分方法。例如,你有 2 个同步方法,它们没有任何相互关联,但是当一个线程运行一个方法时,它会阻塞另一个方法(它可以通过使用 synchronized(a variable) 来阻止) .
但是,应用同步方法很简单,代码看起来也很简单。对于某些类,只有一个同步方法,或者类中的所有同步方法彼此相关 => 我们可以使用synchronized method 使代码更短且易于理解
注意
(它与synchronized 无关,它是对象和类或非静态和静态之间的区别)。
- 当您使用
synchronized 或普通方法或synchronized(this) 或synchronized(non-static variable) 时,它将基于每个对象实例进行同步。
- 当您使用
synchronized 或静态方法或synchronized(class) 或synchronized(static variable) 时,它将基于类同步
参考
https://docs.oracle.com/javase/tutorial/essential/concurrency/syncmeth.html
https://docs.oracle.com/javase/tutorial/essential/concurrency/locksync.html
希望对你有帮助