目录
单例模式:
保证一个类只有一个实例,并且提供一个全局访问点
适用场景:
-
1.需要更严格地控制全局变量时,使用单例模式。
-
2.重量级的对象如线程池对象,数据库连接池对象/不需要多个实例的对象如工具类。
懒汉模式:
启动时不实例化,只有在真正使用的时候,才开始实例化。
使用与注意事项:
public class SingletonTest {
public static void main(String[] args) {
}
class LazySingleton{
//提供私有成员静态变量 volatile修饰的变量避免发生指令重排序
private volatile static LazySingleton singleton;
//私有构造函数(避免外部通过new创建实例)
private LazySingleton() {
}
//全局唯一访问方法
public static LazySingleton getSingleton() {
//存在线程安全问题 ,多个‘null ==singleton 的线程’同时访问的话,
// 就会创建多个实例,通过添加synchronized避免该问题
if (null ==singleton){
synchronized(LazySingleton.class){
if (null ==singleton){
/**
* new操作:jvm操作步骤
* 1.在堆上开辟一个空间
* 2. 返回临时区域“操作数栈”对空间进行初始化
* 3.赋值 singleton
* jvm有可能对这三个步骤指令进行重排序,导致使用到尚未初始化的实例
* volatile修饰的变量避免发生指令重排序
*/
singleton = new LazySingleton();
}
}
}
return singleton;
}
}
}