单例模式(Singleton Pattern)是 Java 中最简单的设计模式之一。这种类型的设计模式属于建立型模式,它提供了一种建立对象的最佳方式。java
这种模式涉及到一个单一的类,该类负责建立本身的对象,同时确保只有单个对象被建立。这个类提供了一种访问其惟一的对象的方式,能够直接访问,不须要实例化该类的对象。设计模式
注意:安全
描述:最基本的实现方式,在外部调用时才会加载,线程不安全线程
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; } }
描述:在类加载时就初始化建立对象,线程安全,但无论是否使用都建立对象可能会浪费内存code
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 提倡的方式,不只能防止反序列化从新建立新的对象,绝对防止屡次实例化,也能防止反射破解单例的问题get
public enum EnumSingleton { INSTANCE; }