我读过synchronized void f() { /* body */ }
相当于
void f() { synchronized (this) { /* body */ } }
。
因此,当我们对单例的get方法执行synchronization
时,我们要同步哪个对象。是类还是对象?
public class YourObject {
private static YourObject instance;
private YourObject() { }
public static synchronized YourObject getInstance() {
if (instance == null) {
instance = new YourObject();
}
return instance;
}
}
这相当于 -
public static YourObject getInstance() {
synchronized (this) {
/* body */
}
}
或
public static YourObject getInstance() {
synchronized (YourObject.class) {
/* body */
}
}
答案 0 :(得分:2)
让我们问the documentation:
您可能想知道静态同步方法会发生什么 调用,因为静态方法与类关联,而不是 宾语。在这种情况下,线程获取内部锁 与类关联的类对象。因此可以访问类的静态 字段由锁定控制,该锁定与任何锁定不同 班级的实例。
所以:
public static YourObject getInstance() {
synchronized (YourObject.class) {
/* body */
}
}
等同于你的代码
答案 1 :(得分:1)
您正在获取类级别的锁定,即同步方法中的静态方法,因此YouObject.class
上的同步等同于静态方法同步。此外,您还无法在静态方法中引用this
,因为this
是指当前或此对象。
所以这个:
public static synchronized YourObject getInstance() {
上面代码中的等同于
synchronized (YourObject.class) {