我读过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 */
}
}
让我们问一下文档:
您可能想知道当静态同步方法处于以下状态时会发生什么情况 调用,因为静态方法与类相关联,而不是与 对象。在这种情况下,线程获取 与类关联的类对象。从而访问类的静态 字段由一个锁控制,该锁不同于任何 类的实例。
所以:
public static YourObject getInstance() {
synchronized (YourObject.class) {
/* body */
}
}
等效于你的代码
您正在获得类级别的锁定,即同步方法中的静态方法,因此YouObject.class
上的同步等效于静态方法同步。此外,您将无法在静态方法中引用this
this
因为它引用当前或此对象。
所以这个:
public static synchronized YourObject getInstance() {
在上面的代码中相当于
synchronized (YourObject.class) {