单例模式
- 单例模式:确保一个类在任何情况下绝对只有一个实例,并且提供全局的访问点
饿汉式单例
- 加载方式:再类加载的时候就立即初始化,并且创建单例对象。
- 线程安全:线程绝对安全。
- 缺点:类加载的时候就初始化,浪费资源
创建方式:
- 私有化构造方法。
- 创建静态常量,并且在类初始化赋值成类对象。
提供全局访问点,返回静态常量(类对象) ```java public class HungrySingleton { private static final HungrySingleton INSTANCE = new HungrySingleton();
private HungrySingleton() { }
public static HungrySingleton getInstance() { return INSTANCE; } }
<a name="o56Dh"></a>## 懒汉式单例<a name="lYbiB"></a>### _内部类加载_- **加载方式**:延迟加载- **线程安全**:线程安全。- **缺点**:```javapublic class LazyInnerClassSingleton implements Serializable {private LazyInnerClassSingleton() {// 防止被反射破坏if (InnerSingleton.INSTANCE != null) {throw new RuntimeException("非法访问");}}public static LazyInnerClassSingleton getInstance() {return InnerSingleton.INSTANCE;}// 默认不加载,只有调用的时候才会加载private static class InnerSingleton {private static LazyInnerClassSingleton INSTANCE = new LazyInnerClassSingleton();}// 防止序列化和返序列化private Object readResolve() {return InnerSingleton.INSTANCE;}}
双锁检验
- 加载方式:延迟加载
- 线程安全:线程安全。
缺点: ```java public class LazySingleton implements Serializable { private static volatile LazySingleton INSTANCE = null;
private LazySingleton() {
// 防止被反射破坏if (INSTANCE != null) {throw new RuntimeException("非法访问");}
} // 增加双锁检测 线程安全,延时加载
public static LazySingleton getInstance() {
if (INSTANCE == null) {synchronized (LazySingleton.class) {if (INSTANCE == null) {INSTANCE = new LazySingleton();}}}return INSTANCE;
} }
<a name="Wdhd0"></a>## 注册式单例<a name="gW72g"></a>### _注册式单例- 容器单例_- _容器式单例适用于创建实例非常多的情况,便于管理。但是,是非线程安全的_```javapublic class ContainerSingleton {private ContainerSingleton() {}private static Map<String, Object> ioc = new ConcurrentHashMap<String, Object>();public static Object getBean(String className) {synchronized (ioc) {if (!ioc.containsKey(className)) {Object obj = null;try {obj = Class.forName(className);ioc.put(className, obj);} catch (ClassNotFoundException e) {e.printStackTrace();}return obj;} else {return ioc.get(className);}}}}
注册式单例- 枚举单例
- 优点:枚举类不能通过反射创建,现成安全
缺点:属于懒加载,直接加载在内存中 ```java public enum EnumSingleton { // INSTANCE; private Object data;
public Object getData() {
return data;
}
public void setData(Object data) {
this.data = data;
}
public static EnumSingleton getInstance() {
return INSTANCE;
}
} ```
