单例模式(Singleton Pattern)是 Java 中最简略的设计模式之一。这种类型的设计模式属于创立型模式,它提供了一种创建对象的最佳形式。
这种模式波及到一个繁多的类,该类负责创立本人的对象,同时确保只有单个对象被创立。这个类提供了一种拜访其惟一的对象的形式,能够间接拜访,不须要实例化该类的对象。
留神:
- 1、单例类只能有一个实例。
- 2、单例类必须本人创立本人的惟一实例。
- 3、单例类必须给所有其余对象提供这一实例。
实现形式
懒汉式、线程不平安
形容:最根本的实现形式,在内部调用时才会加载,线程不平安
public class LazySingleton { private static LazySingleton intstance; public LazySingleton(){} public static LazySingleton getInstance(){ if (intstance == null){ intstance = new LazySingleton(); } return intstance; }}
懒汉式、线程平安
形容:线程平安,必须加锁 synchronized 能力保障单例,但加锁会影响效率
public class LazySingleton { private static LazySingleton intstance; private LazySingleton(){} public static synchronized LazySingleton getInstance(){ if (intstance == null){ intstance = new LazySingleton(); } return intstance; }}
饿汉式
形容:在类加载时就初始化创建对象,线程平安,但不论是否应用都创建对象可能会节约内存
public class HungrySingleton { private static HungrySingleton intstance = new HungrySingleton(); private HungrySingleton(){} public static HungrySingleton getInstance(){ return intstance; }}
双重查看锁
形容:应用volatile以及多重查看来减小锁范畴,晋升效率
public class DoubleCheckSingleton { private DoubleCheckSingleton(){} private volatile static DoubleCheckSingleton instance; public static DoubleCheckSingleton getInstance(){ if (instance == null){ synchronized (DoubleCheckSingleton.class){ if (instance == null){ instance = new DoubleCheckSingleton(); } } } return instance; }}
动态外部类
形容:同时解决饿汉式的内存节约问题和懒汉式的线程平安问题
public class StaticSingleton { private StaticSingleton(){} private static class StaticClass{ public static final StaticSingleton instance = new StaticSingleton(); } public static StaticSingleton getInstance(){ return StaticClass.instance; }}
枚举
形容: Effective Java 作者 Josh Bloch 提倡的形式,不仅能避免反序列化从新创立新的对象,相对避免屡次实例化,也能避免反射破解单例的问题
public enum EnumSingleton { INSTANCE;}