什么是Singleton实例同步?

时间:2014-12-09 12:03:29

标签: java concurrency synchronization singleton

我读过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 */
    }
}

2 个答案:

答案 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) {