volatile

 

多线程下的单例模式 (DCL double check lock )

volatile: 内存可见,禁止指令重排。

 

如果不加volatile, 可能1kw次请求,只会有一次发生错误,因为字节码会发生指令重拍, 产生的影响可能是:instance 分配了地址,但是却没有内容,也就是说 return instance 仅仅是地址,但是内容为空。此时使用instance的时候会发生异常。

 

class Singleton {

    private volatile static Singleton instance;
    public Singleton getInstance() {
        if(null ==  instance) {
            synchronized() {
                if(null ==  instance) {
                    instance = new Singleton(); // 由于指令重排,instance 分配了地址,但是却没有内容,也就是说 return instance 仅仅是地址,但是内容为空。
                }
            }
        }
        return instance;
    }
}

 

 

 

posted @ 2019-05-26 20:34  webglcn  阅读(143)  评论(0编辑  收藏  举报