[设计模式总结] 5. 单例模式(以及多线程、无序写入、volatile对单例的影响)
单例模式
http://www.ibm.com/developerworks/cn/java/j-dcl.html
Ensure a class has only one instance, and provide a global point of access to it.
确保某个类只有一个实例,并提供一个全局访问点。
类图:public static Singleton getInstance(){ if (instance == null) { synchronized(Singleton.class) { //1 Singleton inst = instance; //2 if (inst == null) { synchronized(Singleton.class) { //3 inst = new Singleton(); //4 } instance = inst; //5 } } } return instance;}
这里的关键行是 //5。此行应该确保 instance 只为 null 或引用一个构造完整的Singleton 对象
BUT,Java 语言规范(Java Language Specification,JLS)要求不能将synchronized 块中的代码移出来。但是,并没有说不能将synchronized 块外面的代码移入synchronized 块中。JIT 编译器会在这里看到一个优化的机会。此优化会删除 //4 和 //5 处的代码,导致还是会有无序写入带来的问题!!!