java设计模式学习记录之———单例模式

89 阅读2分钟

一 what(什么是单例模式)?

    程序运行时,在java虚拟机中只存在该类的一个实例对象

二 when (什么时候需要用单例模式)?

    就是当我们希望类在程序运行时只存在一个实例对象的时候使用...(额,感觉是废话),比如Android里面application就是单例。

三 how (怎么使用)

    单例模式分为 (1)懒汉模式和(2)饿汉模式

1 饿汉模式:

1679041025609.png 分析:饿汉式单例,天然的线程安全。系统初始化JVM加载类的过程中就创建了这个唯一的对象

2 懒汉模式:

1679043268425.png 分析:懒汉模式的实现方式有很多种,双重判断 + volatile 关键字的实现方式算是比较完善的一种;

(1)第一个if判断,过滤出一些不需要创建对象的情况(比如已经创建过对象);

(2)Synchronized加锁作用:多线程下,保证工作线程在对对象做操作的时候,别的线程不能对持有对象的锁,也就是不能对对象做操作,防止在A线程: mInstance = new SingleInstance(),同时在B线程操作:mInstance = null 的情况,导致最终数据不准确;

(3) 第二个if判断是防止当A B两个线程同时进入第一个if之后,在注释1和注释2之间这里,此时A获取了类锁,然后B线程被阻塞,A线程新建了一个实例后释放了锁,B线程获取锁,又新建了一个实例,这破坏了[单例设计模式]的初衷;

(4) volatile在这里是防止指令重排序,因为mInstance = new SingleInstance不是原子操作,它包括: a.创建SingleInstance对象; b.给SingleInstance对象分配内存地址; c.将SingleInstance对象指向对象的引用mInstance; 要是没有volatile防止指令重排序而发生指令重排序,创建对象后没有给对象分配内存地址就指向mInstance,也就是a-c-b的顺序, 另外一个线程获取到的就是一个空对象;

以上就是对单例模式学习的总结,欢迎大家一起学习讨论,有啥问题欢迎大佬指正;