应用场景: 线程池、缓存、日志对象、注册表设置等
public class Singleton{ private static Singleton singleton = null; private Singleton(){} // synchronized修饰该方法虽然让各个线程互斥的访问此方法解决多线程下线程不安全的问题但是来带来了性能上的问题 // 真正需要同步的只有第一次创建实例的时候 private static synchronized Singleton getInstance(){ singleton = new Singleton(); return singleton; } }
双重检查锁的单例模式,首先检查实例是否创建如果未创建,才进行同步,这样一来只有真正创建单例的时候才会进行同步操作。
public class Singleton{ private volatile static Singleton singleton = null; // volatile关键字的作用 1.保证变量可见性 2.保证变量有序性 private Singleton(){} private static Singleton getInstance(){ if(singleton == null){ // 第一次判空,检查实例是否存在如果不存在再进入同步块 synchronized(Singleton.class){ if(singleton == null){ // 第二次判空,检查实例是否存在,如果仍然为null,则创建实例 singleton = new Singleton(); } } } return Singleton; } }