- 饿汉模式:在加载类初始化的阶段进行创建。
- 饱汉模式:使用的时候才创建。
饿汉模式实现:
public class Singleton{//实现一 利用JVM对类的解析。 private Singleton(){}//构造函数私有化 private static Singleton instance=new Singleton(); public static Singleton getInstance(){return instance;}}public class Singleton{//实现二 利用静态内部类 private static class InnerSingleton{ private static Singleton instance=new Singleton(); } private Singleton(){ if(InnerSingleton.instance!=null)//防止反射创建对象。 throw new RuntimeException("单例不能生成多个实例"); } public static Singleton getInstance(){return InnerSingleton.instance;}}public enum Singleton{//实现三 利用枚举类型。枚举类型天然不允许反射创建。 INSTANCE; public void print(){ System.out.println(this.hashCode()); }}public class Singleton{ private static class InnerSingleton{ private Singleton instance=new Singleton(); } private Singleton(){ if(InnerSingleton.instance!=null) throw new RuntimeException("单例不允许多个实例"); } public static Singleton getInstance(){return InnerSingleton.instance;} Object readResolve()throws ObjectStreamException{//用于反序列化时调用。 return InnerSingleton.instance; }}
饱汉模式:DoubleCheck
@ThreadSafepublic class Singleton{ private volatile static instance;//volatile 这里主要是防止指令重排。 private Singleton(){} public static Singleton getInstance(){ if(instance==null){ //可能有多个线程阻塞在此。 synchronized(Singleton.class){ //因为可能有多个线程拿到锁,所以需要再加一层判断。 if(instance==null) instance=new Singleton(); } } return instance; }}
饱汉模式:延迟初始化占位类模式(最佳)
@ThreadSafepublic class Singleton{ private Singleton(){} private static class InnerSingleton{ public static Singleton instance=new Singleton(); } public static Singleton getInstance(){ return InnerSingleton.instance; }}