Java线程安全的Singleton具有双重检查的锁定
示例
这种类型的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;
}
}必须强调的是-在JavaSE5之前的版本中,上述实现是错误的,应避免使用。在Java5之前的Java中无法正确实现双重检查锁定。