Singleton 单例模式
单例模式
应用场景
- 比如Factory
-
饿汉模式
public class Singleton{private static Singleton instance = new Singleton();//私有的构造方法private Singleton(){}public static Singleton getInstance(){return instance;}}
懒汉模式
DCL失效问题,因为JIT优化导致的指令重排,所以要加volatile,实现有序性和可见性。
public class Singleton{private static volatile Singleton instance;private Singleton(){}public static Singleton getInstance(){if(instance==null){synchronzed(Singleton.Class){if(instance==null){instance = new Singleton();}}}return instance;}}
但是加了volatile后,会拥有读写屏障,会使得该变量的读效率变低,我们只需要写屏障使得其不会重排序,故有以下修改
public class Singleton{private static volatile Singleton instance;private Singleton(){}public static Singleton getInstance(){if(instance==null){synchronzed(Singleton.Class){if(instance==null){Singleton instance = new Singleton();//在此处添加写屏障,使得该处的指令不会重排序。Unsafe.getUnsafe().storeFence();Singleton.instance = instance;}}}return instance;}}
静态内部类
public class Singleton{private Singleton(){}private static class SingletonInstance{private static instance = new Singleton();}public static Singleton getInstance(){return SingletonInstance.instance;}}
enmu
enum singleton{INSTANCE;}
