这种类型的Singleton是线程安全的,并且可以在创建Singleton实例之后防止不必要的锁定。
public class MySingleton { // 类的实例 private static volatile MySingleton instance = null; // 私有构造函数 private MySingleton() { // 一些构造对象的代码 } public static MySingleton getInstance() { MySingleton result = instance; //如果实例已经存在,则无需锁定 if(result == null) { //单例实例不存在,请锁定并再次检查 synchronized(MySingleton.class) { result = instance; if(result == null) { instance = result = new MySingleton(); } } } return result; } }
必须强调的是-在Java SE 5之前的版本中,上述实现是错误的,应避免使用。在Java 5之前的Java中无法正确实现双重检查锁定。