关于单例模式中volatile的使用

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了关于单例模式中volatile的使用相关的知识,希望对你有一定的参考价值。

参考技术A

在设计模式当中,有一种设计方式叫做单例模式。

所谓的单例模式 ,就是保证一个类中只有一个实例

接下来就是根据定义来创建一个单例模式

那么思路到这里应该都理解了,接下来就是单例的模式的实现模式:

在之前学习volatile的时候,发现了,对可变的共享数据进行放回,如果没有保证同步,会出现不可预期的结果。

以及单例模式的时候,我们发现了一个模式叫做双重校验锁,他使用到了volatile。假如没有使用volatile会出现什么情况呢。

java相关的对象创建的流程,他有部分一下流程:

接下来假设一个案例:

多线程A与多线程B,同时调用getSingleton()获取singleton的时候。

线程A--》我并没按照顺序创建了对象,给内存返回了对象在堆上的引用,但是我还没有初始化

线程B--》我检查到对应地址啦,不是空,那我可以用了。

---》实际上sinleton还没完全创建好,这一用就出现了问题

volatile

那么上述出现的问题就是对象的创建没有保证顺序,volatile关键字他可以禁止指令重排序来保证一定的有序性,所这个时候就不会出现问题了

面试突击51:为什么单例一定要加 volatile?

单例模式的实现方法有很多种,如饿汉模式、懒汉模式、静态内部类和枚举等,当面试官问到“为什么单例模式一定要加 volatile?”时,那么他指的是为什么懒汉模式中的私有变量要加 volatile? 懒汉模式指的是对象的创建是懒加载的方式,并不是在程序启动时就创建对象,而是第一次被真正使用时才创建对象。

以上是关于关于单例模式中volatile的使用的主要内容,如果未能解决你的问题,请参考以下文章

单例模式中volatile关键字的作用

并发编程之单例模式,volatile和 synchronized

优雅设计封装基于Okhttp3的网络框架:多线程单例模式优化 及 volatile构建者模式使用解析

单例模式中的volatile关键字

Android 深入理解单例模式

面试突击51:为什么单例一定要加 volatile?