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; } }