单例模式
作者:碳水怪兽👾 发布于:2021/10/6
前言
单例模式属于创建型设计模式,保证一个类只有一个实例,单例模式可以实现延迟加载(在使用时才去创建实例),同时由于只有一个实例,单例模式可以节省资源(内存),甚至可以减轻GC的压力,不过单例模式也可能带来线程安全的问题。
正文
单例模式的几种实现方式
- 饿汉式单例
- 懒汉式单例
- 双重检查单例
- 枚举单例
- 静态内部类单例
- ThreadLocal单例
饿汉式单例
public class HungrySingleton {
private static final HungrySingleton instance = new HungrySingleton();
public static HungrySingleton getInstance(){
return instance;
}
}
懒汉式单例
懒汉式单例会有线程安全的问题
public class LazySingleton {
private static LazySingleton instance;
public static LazySingleton getInstance(){
if(instance == null){
instance = new LazySingleton();
}
return instance;
}
}
双重检查单例
public class DoubleCheckSingleton {
private static volatile DoubleCheckSingleton instance;
public static DoubleCheckSingleton getInstance() {
if (instance == null) {
synchronized (DoubleCheckSingleton.class) {
if (instance == null) {
instance = new DoubleCheckSingleton();
}
}
}
return instance;
}
}
枚举单例
public enum EnumSingleton {
INSTANCE;
private Object obj;
public static EnumSingleton getInstance(){
return INSTANCE;
}
}
静态内部类单例
public class StaticInnerClassSingleton {
private static class Holder{
private static final StaticInnerClassSingleton instance = new StaticInnerClassSingleton();
}
public static StaticInnerClassSingleton getInstance(){
return Holder.instance;
}
}
ThreadLocal单例
这种单例不是进程中唯一,而是线程中唯一
public class ThreadLocalSingleton {
private static final ThreadLocal<ThreadLocalSingleton> theadLocal = new ThreadLocal<ThreadLocalSingleton>(){
@Override
protected ThreadLocalSingleton initialValue() {
return new ThreadLocalSingleton();
}
};
public static ThreadLocalSingleton getInstance(){
return theadLocal.get();
}
}
结尾
单例模式的应用
单例模式在线程池、缓存、Spring的Bean容器都有应用