文章目录
单例模式(Singleton Pattern)是一种对象创建型模式
单例模式:确保一个类仅有一个实例,且自行实例化,并对外提供这个唯一的实例
单例模式实现方式分为非延时加载(饿汉式 Eager Singleton)和 延时加载(懒汉式 Lazy Singleton),延时加载( 节省内存)可以有效提高系统资源的利用效率,所以通常使用延时加载的懒汉式实现
懒汉式,线程不安全
/**
* 懒汉式单例模式,线程不安全
*/
class LazySingleton {
//这里省略了属性...
//将构造函数设为private
private LazySingleton(){
}
//与饿汉式不同,懒汉式并不会立即初始化
private static LazySingleton instance = null;
public static LazySingleton getInstance(){
if(instance == null){
instance = new LazySingleton();
}
return instance;
}
}
懒汉式单例模式在第一次调用 getInstance() 方法时,实例化 LazySingleton 对象,在类加载时并不自行实例化,这种技术称为:延时加载技术(Lazy Load)
上诉代码存在线程安全问题。在多线程情况下:
🍁1️⃣ 线程A进入 if (instance == null) 中,还没来的及执行 instance = new LazySingleton(); 语句创建 instance 对象,时间片就切换给了线程B ;🍁2️⃣ 此时由于instance 对象还没创建,instance 对象为空,所以线程B也进入if (instance == null) 中,并顺利执行 instance = new LazySingleton(); 语句创建了instance 对象 ;🍁3️⃣ 在线程A重新获得时间片后,开始执行 instance = new LazySingleton(); 语句,也创建了instance 对象。🍀4️⃣ 此时线程A 和 线程B都创建了instance对象,这就违背了单例模式的初衷。
所以严格意义上 懒汉式,线程不安全 并不算单例模式,因为它在多线程情况下不能正常工作。