1.简单模式,没有实现延迟加载
public class Singleton{ private Singleton(){} private Singleton instance = new Singleton(); public static Singleton getInstance(){ return instance; } }
2.内部静态类方式
public class Singleton{ private static class SingletonHolder{ private final static Singleton INSTANCE = new Singleton(); } public static Singleton getInstance(){ return SingletonHolder.INSTANCE; } }
通过静态内部类实现延迟加载
3.同步代码方式
public class Singleton { private static Singleton instance = null; private Singleton(){ //init } public static synchronized Singleton getInstance(){ if(instance == null){ instance = new Singleton(); } return instance; } private static volatile Singleton instance1; public static Singleton getInstance1(){ if(instance1 == null){ synchronized (instance1) { if(instance1 == null){ instance1 = new Singleton(); } } } return instance1; } }
synchronized同步方法比较耗性能,因此可以采用预判断+synchronized代码块的方式实现,volatile关键字可以保存内存的可见一致性。
4.枚举
public enum EnumSingleton { INSTNCE; private EnumSingleton(){ } private String name; public String getName(){ return null; } }
使用枚举模式可以避免实例进行通过序列化后反序列化再生成一个实例。