单例模式
参考:
漫画:什么是单例模式?
单例模式的七种写法
1. 饿汉式
public class Singleton {
private static Singleton instance = new Singleton();
private Singleton (){
}
public static Singleton getInstance() {
return instance;
}
}
- 类加载较慢,但获取对象的速度快
- 基于类加载机制避免了多线程的同步问题
2. 懒汉式(线程不安全)
public class Singleton {
private static Singleton instance;
private Singleton (){
}
public static Singleton getInstance() {
if (instance == null) {
instance = new Singleton();
}
return instance;
}
}
- 系统启动时不进行初始化,加快了启动速度
- 第一次加载时需要实例化,反映稍慢一些
- 而且在多线程不能正常工作
3. 懒汉模式(线程安全)
public class Singleton {
private static Singleton instance;
private Singleton (){
}
public static synchronized Singleton getInstance() {
if (instance == null) {
instance = new Singleton();
}
return instance;
}
}
- 线程安全
- 每次调用getInstance方法时都需要进行同步,造成不必要的同步开销
4. 双重检查模式 (DCL)
public class Singleton {
private volatile static Singleton instance;
private Singleton (){
}
public static Singleton getInstance() {
if (instance== null) {
synchronized (Singleton.class) {
if (instance== null) {
instance= new Singleton();
}
}
}
return singleton;
}
}
- 启动速度快
- 第一次加载时反应稍慢一些
- 线程安全,效率高
5. 静态内部类单例模式
public class Singleton {
private Singleton(){
}
public static Singleton getInstance(){
return SingletonHolder.sInstance;
}
private static class SingletonHolder {
private static final Singleton sInstance = new Singleton();
}
}
第一次加载Singleton类时并不会初始化sInstance,只有第一次调用getInstance方法时虚拟机加载SingletonHolder 并初始化sInstance ,这样不仅能确保线程安全也能保证Singleton类的唯一性,所以推荐使用静态内部类单例模式。
6. 枚举单例
public enum Singleton {
INSTANCE;
public void doSomeThing() {
}
}
- 线程安全的,并且在任何情况下都是单例
- 使用简单
7. 使用容器实现单例模式
典型应用:Spring
有什么办法可以打破单例模式?
- 反射
- 序列化和反序列化
网友评论