- Published on
高并发设计模式-07
7.1 线程安全的单例模式
单例模式是常见的一种设计模式,一般用于全局对象管理,比如XML读写实例、系统配置实例、任务调度实例、数据库连接池实例等。
7.1.1 饿汉式单例
public class Singleton1 {
// 私有构造区
private Singleton1() {
}
// 静态成员
private static final Singleton1 single = new Singleton1();
public static Singleton1 getInstance() {
return single;
}
}
饿汉单例模式的优点是足够简单、安全。**其缺点是:单例对象在类被加载时,实例就直接被初始化了。**很多时候,在类被加载时并不需要进行单例初始化,所以需要对单例的初始化予以延迟,一直到实例使用的时候初始化。
7.1.2 懒汉式单例
/**
* 简单的懒汉单例模式
*
* @author: wangyj
* @create: 2022-04-21
* @version: 1.0.0
**/
public class ASingleton {
// 静态成员
static ASingleton instance;
// 私有构造区
private ASingleton() {
}
// 获取单例的方法
static ASingleton getInstance() {
if (instance == null) {
instance = new ASingleton();
}
return instance;
}
}
以上懒汉单例模式的实现大家都很熟悉,估计也编写过类似的代码。以上参考实现在单线程场景中是合理的、安全的。在第一次被调用时,getInstance()方法会新建一个ASingleton实例,但之后访问时返回的是第一次新建的ASingleton实例。
多线程并发访问getInstance()方法时,问题就出来了:不同的线程有可能同时进入代码①处的条件判断,多次执行代码②,从而新建多个ASingleton对象。