今天看《设计模式》的时候看到一段代码:class Singleton{
    private volatile static Singleton uniqueInstance;
    private Singleton(){}
    public static Singleton getInstance(){
        if (uniqueInstance == null){
            synchronized (Singleton.class){
                if (uniqueInstance == null){
                    uniqueInstance = new Singleton();
                }
            }
        }
        return uniqueInstance;
    }
}这里边的volatile,有什么必要性吗?我没看懂。

解决方案 »

  1.   

    一个线程修改了变量,其他线程可以立即知道. 一个程序运行的时候,内存会分为两部分,一个是工作内存,一个是主内存。
    使用了volatile 关键字可以理解为,只要变量一更改,就通知到其他地方。
      

  2.   

    是时候祭出我收藏许久的一篇文章了
    http://www.barryzhang.com/archives/521,进去后ctrl+F,搜索volatile,你就知道为什么要volatile了。
    想彻底理解单例模式的,可以好好看这篇文章。
      

  3.   

    可以简单理解为,任何对volatile的变量的读写都是经过加锁。
      

  4.   

    主要是因为java虚拟机自身优化的关系。程序运行的时候会把uniqueInstance从内存读到寄存器里面,如果修改变量值,可能会只修改寄存器中的变量,内存中的没有修改,多线程情况下会出现内存中的数据和寄存器中保存的值不一致。volatile 就是要求线程直接从内存中读取,不使用寄存器中保留的备份。大致是这样,凭印象答的
      

  5.   

    楼上都在说可见性,单例这里并不是因为可见性问题,synchronized已经可以保证可见性了,这里是因为指令重排序问题
    http://blog.csdn.net/a1282379904/article/details/52335016