class MyClass {
private static volatile MyClass myClass = null;

private MyClass() {
}

public static MyClass getInstance() {
if(myClass == null) {
synchronized (MyClass.class) {
if(myClass == null) {
myClass = new MyClass();
}
}
}
return myClass;
}
}volatile关键字我不太明白在上面代码中的作用,既然已经进行双重检查了,还有必要把myClass声明volatile吗?
求教,谢谢!

解决方案 »

  1.   

    没有volatile并不能保证双检锁正确工作。
    这种模式现在基本不建议使用了,不必关注了
    重点可以去看一下java内存模型。
      

  2.   

    volatile关键字不是已经废弃了吗
      

  3.   

    volatile确保了并发时的可视性,即使volatile的域使用了本地缓存,volatile域也会被立即写入主存
    虽然有双检查了,可能是为了更加安全吧
      

  4.   

    书上说1.4以前的版本这么做会失效。
    以后的版本也不建议使用?
    您的意思是,这种单例模式的实现方法不推荐了是吗?您说的java内存模型,跟这个有什么关系吗?解释一下..没太明白。
      

  5.   

    http://www.ibm.com/developerworks/cn/java/j-dcl.html