![](https://csdnimg.cn/release/download_crawler_static/86347009/bg5.jpg)
singleton = new Singleton();
}
return singleton;
}
}
iii).方法的同步会导致性能下降,使用双检锁,保证一次初始化成功,其余的快速返回.
双检锁:尽量将加锁推迟,只在需要时加锁.
public class Singleton{
//Java 使用双重检查锁定机制,由于 Java 编译器和 JIT 的优化原因系统无法保证程序按期
望的顺序执行,使用 volatile 声明的变量可以强制屏蔽编译器和 JIT 的优化工作(JVM 根据 CPU
的特性,适当的重排序机器指令,使得最大限度的发挥 CPU 的性能,但是如果没有 volatile 可能
出现一个线程 t1 的 A 操作和另一个线程的 B 操作之间对 instance 的读写没有 happens-
before,可能造成 t1 的 A 操作还没完全构造成功,但 t2 的 B 操作已经看到 instance 为空,这样 t2
就会返回未完全构造的 instance 的引用,就会导致 t2 对 instance 的引用出错.).
private volatile static Singleton singleton;
//私有构造函数,保证外界无法直接实例化
private Singleton(){}
//提供外部访问
public static Singleton getInstance(){
if(singleton == null){
synchronized(Singleton.class){
if(singleton == null){
singleton = new Singleton();
}
}
}
return singleton;
}
}
iv).Lazy initialization holder class 方式实现: 满足双检锁但是没有显示的同步
public class Singleton{
//私有构造函数,保证外界无法直接实例化
private Singleton(){}
private static class SingletonHolder{
private static final Singleton INSTANCE = new Singleton();
}
//提供外部访问
public static Singleton getInstance(){
return SingletonHolder.INSTANCE;
}
}
v).枚举实现:
public enum Singleton {
// 定义枚举元素,他就是 Singleton 的一个实例