对于创建单例,通常我们使用以下静态工厂方法,其中同步锁在类本身上:
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时,类实例本身 .....将在获得单例的结果中存在任何差异/错误?