什么是单一实例同步



我读过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) {