关于单例模式中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和 synchronized