线程安全 Singleton 双重检查锁定
这种类型的 Singleton 是线程安全的,并且在创建 Singleton 实例后防止不必要的锁定。
Version >= Java SE 5
public class MySingleton {
// instance of class
private static volatile MySingleton instance = null;
// Private constructor
private MySingleton() {
// Some code for constructing object
}
public static MySingleton getInstance() {
MySingleton result = instance;
//If the instance already exists, no locking is necessary
if(result == null) {
//The singleton instance doesn't exist, lock and check again
synchronized(MySingleton.class) {
result = instance;
if(result == null) {
instance = result = new MySingleton();
}
}
}
return result;
}
}
必须强调的是 - 在 Java SE 5 之前的版本中,上面的实现是不正确的 ,应该避免。在 Java 5 之前,无法在 Java 中正确实现双重检查锁定。