工厂Vs上的同步锁定之间的区别锁定在类实例上?

时间:2016-01-11 04:56:41

标签: multithreading locking synchronized volatile

对于创建单例,通常我们使用以下静态工厂方法,其中同步锁在类本身上:

private volatile static MyClass instance;
public static MyClass getInstance() throws Exception {
    if(instance == null) {
        synchronized (MyClass.class) {
            if(instance == null) {
                    instance = new MyClass();
            }
        }
    }
    return instance;
}

相反,如果我们使用工厂模式并将内部锁定放在工厂类上,如:

public class MyFactory {
    private volatile static MyClass instance = null;
    public static MyClass getInstance() throws Exception{
        if(instance == null) {
          synchronized (MyFactory.class) {
            if(instance == null) {
                instance = new MyClass();
            }
          }
        }
        return instance;
    }
}

---这里工厂模式代码已经简化,以展示锁而不是模式的逻辑。

将类实例本身的锁定置于创建实例的工厂类之间的区别是什么?

当实例为null并且多个线程竞相锁定工厂类Vs时,类实例本身 .....将在获得单例的结果中存在任何差异/错误?

1 个答案:

答案 0 :(得分:0)

如果您想了解有关单身人士的更多信息,建议您阅读this article。它将为您提供一个很好的解释,其中包含解释各种实现的精美代码段。