单例模式:确保一个类在任何情况下只有一个实例,并提供一个全局访问点,隐藏其所有构造方法
饿汉式
1 2 3 4 5 6 7 8 9
| public class HungrySingleton { private static final HungrySingleton HUNGRY_SINGLETON = new HungrySingleton(); private HungrySingleton() {}
public static HungrySingleton getInstance() { return HUNGRY_SINGLETON; } }
|
懒加载
普通方式
1 2 3 4 5 6 7 8 9 10 11 12
| public class LazySingleton { private static LazySingleton instance; private LazySingleton() {}
public synchronized static LazySingleton getInstance() { if (instance == null) { instance = new LazySingleton(); } return instance; } }
|
Double-Check
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
| public class LazyDoubleCheckSingleton {
private static volatile LazyDoubleCheckSingleton instance; private LazyDoubleCheckSingleton() {}
public static LazyDoubleCheckSingleton getInstance() { if (instance == null) { synchronized (LazyDoubleCheckSingleton.class) { if (instance == null) { instance = new LazyDoubleCheckSingleton(); } } } return instance; } }
|
内部类实现懒加载
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| public class LazyInnerClassSingleton { private LazyInnerClassSingleton() { if (LazyHolder.instance != null) { throw new RuntimeException("不允许构建多个实例"); } }
public synchronized static LazyInnerClassSingleton getInstance() { return LazyHolder.instance; }
private static class LazyHolder { private static final LazyInnerClassSingleton instance = new LazyInnerClassSingleton(); } }
|
容器式单例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
| public class ContainerSingleton { private static final ConcurrentHashMap<String, Object> container = new ConcurrentHashMap<>();
private ContainerSingleton() {
}
public static Object getBean(String className) { synchronized (container) { if (!container.containsKey(className)) { Object object = null; try { object = Class.forName(className); container.put(className, object); } catch (ClassNotFoundException e) { e.printStackTrace(); } } return container.get(className); } } }
|
枚举实现
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| public enum EnumSingleton { INSTANCE;
private Object data; public static EnumSingleton getInstance() { return INSTANCE; }
public Object getData() { return data; }
public void setData(Object data) { this.data = data; } }
|
ThreadLocal实现
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| public class ThreadLocalSingleton { private static final ThreadLocal<ThreadLocalSingleton> threadLocalInstance = new ThreadLocal<ThreadLocalSingleton>(){ @Override protected ThreadLocalSingleton initialValue() { return new ThreadLocalSingleton(); } };
private ThreadLocalSingleton(){}
public static ThreadLocalSingleton getInstance(){ return threadLocalInstance.get(); } }
|
Serializable实现单例
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| public class SerializableSingleton implements Serializable { private static final SerializableSingleton INSTANCE = new SerializableSingleton(); private SerializableSingleton() {}
public static SerializableSingleton getInstance() { return INSTANCE; }
private Object readResolve() { return INSTANCE; } }
|
破坏单例的方法
- 通过反射获取单例的构造方法,创建实例
- 通过将单例序列化再反序列化后,也会破坏单例 (可以在单例内添加
readResolve
方法解决)