同步锁的失败可能
以下例子参考http://developer.51cto.com/art/201104/256239.htm
网上闲逛时发现一篇博文,讲的是单例同步锁时失败的可能,提到的错误自己基本都忽略了,下面以其中的例子说一下自己的理解。
单例模式是比较简单直接的:
public class Singleton { private static Singleton instance = null; private Singleton(){} public static Singleton getInstance() { if(instance == null) { instance = new Singleton(); } return instance; } }public class Singleton { private static Singleton instance = null; private Singleton(){} public synchronized static Singleton getInstance() { if(instance == null) { instance = new Singleton(); } return instance; } }public class Singleton { private static Singleton instance = null; private Singleton(){} public static Singleton getInstance() { if(instance == null) { synchronized(Singleton.class) { if(instance == null) { instance = new Singleton(); } } } return instance; }}public class Singleton { private static Singleton instance = null; private Singleton(){} public static Singleton getInstance() { if(instance == null) { Singleton temp; synchronized(Singleton.class) { temp = instance; if(temp == null) { synchronized(Singleton.class) { temp = new Singleton(); } instance = temp; } } } return instance; } }public class Singleton { private static volatile Singleton instance = null; private Singleton(){} public static Singleton getInstance() { if(instance == null) { synchronized(Singleton.class) { if(instance == null) { instance = new Singleton(); } } } return instance; } }