1、饿汉式单例类
class EagerSingleton { private static final EagerSingleton instance = new EagerSingleton(); private EagerSingleton() { } public static EagerSingleton getInstance() { return instance; } }
2、懒汉式单例类
class LazySingleton { private static LazySingleton instance = null; private LazySingleton() { } synchronized public static LazySingleton getInstance() { if (instance == null) { instance = new LazySingleton(); } return instance; } }
或者
public static LazySingleton getInstance() { if (instance == null) { synchronized (LazySingleton.class) { instance = new LazySingleton(); } } return instance; }
3、双重检查锁定-懒汉式单例
class LazySingleton { private volatile static LazySingleton instance = null; private LazySingleton() { } public static LazySingleton getInstance() { //第一重判断 if (instance == null) { //锁定代码块 synchronized (LazySingleton.class) { //第二重判断 if (instance == null) { instance = new LazySingleton(); //创建单例实例 } } } return instance; } }
4、Initialization Demand Holder (IoDH)静态内部类之单例模式
class Singleton { private Singleton() { } private static class HolderClass { private final static Singleton instance = new Singleton(); } public static Singleton getInstance() { return HolderClass.instance; } }
IoDH可以实现延迟加载,又可以保证线程安全,不影响系统性能,不失为一种最好的Java语言单例模式实现方式(其缺点是与编程语言本身的特性相关,很多面向对象语言不支持IoDH)。
5、序列化和反序列化 -- 单例模式
public class SingletonTwo implements Serializable{ /** * 序列化与反序列化方式 */ private static final long serialVersionUID = 1L; private static class SingletonHan{ private static final SingletonTwo single = new SingletonTwo(); } private SingletonTwo(){} public static SingletonTwo getInstance(){ return SingletonHan.single; } /** * 反序列化接口 * @return * @throws ObjectStreamException */ protected Object readResolve() throws ObjectStreamException{ return SingletonHan.single; } }
6、使用static代码块
public class Singleton { private static Singleton instance = null; private Singleton(){} /** * 静态代码块实现 */ static{ instance = new Singleton(); } public static Singleton getInstance(){ return instance; } }
7、使用enum枚举数据类型
/** * enum枚举实现单例模式 * @author MIXCS * */ public class SingletonEnum { public enum EnumSingle{ singleton; private SingletonEnum instance; private EnumSingle(){ instance = new SingletonEnum(); } public SingletonEnum getSingele(){ return instance; } } public static SingletonEnum getInstance(){ return EnumSingle.singleton.getSingele(); } }