java中的双重校验锁_[Java学习] 单例模式饿汉式双检锁/双重校验锁中的volatile

news/2024/8/26 10:10:53

双检锁/双重校验锁(DCL,即 double-checked locking)

JDK 版本:JDK1.5 起

是否 Lazy 初始化:是

是否多线程安全:是

实现难度:较复杂

描述:这种方式采用双锁机制,安全且在多线程情况下能保持高性能。getInstance() 的性能对应用程序很关键。

实例

public class Singleton {

private volatile static Singleton singleton;

private Singleton (){}

public static Singleton getSingleton() {

if (singleton == null) {

synchronized (Singleton.class) {

if (singleton == null) {

singleton = new Singleton();

}

}

}

return singleton;

}

}

我们可以看到第二行中有个volatile 的关键字,那么volatile 有啥用呢?这时候我们要先了解在java中通过new的方式创建对象的过程的具体步骤

e913eecce3b40ea4884d288155787b80.png

在通过new创建对象时有三个步骤:

分配内存空间

初始化对象

将内存空间的地址赋值给对应的引用

但是这个操作是非原子性操作,啥意思?就是说它不是一个整体操作,它的执行顺序是能被打乱的

可能就成了这样:

ddb8e4daafa0a56e1b1822cbc269c3a9.png

为什么会出现这种情况呢?是因为JVM在加载当前操作的时候是由指令来执行这些代码的,也就是这些代码会被翻译成一个一个的指令刚才的三步就是三个指令。指令执行要有顺序,但是jvm执行默认的时候是没有顺序的。但是这个乱序概率发生的概率非常非常的低,正常情况在是不会发生的但是要是在运行过程中电脑卡机了就可能发生cup被抢导致了正在执行的指令被抢。所以我们有个指令重排的概念,什么是指令重排?简单点刚才我们指令顺序混乱就是指令重排,而volatile的作用就是能禁止指令重排,也就是会让jvm必须按123的顺序执行。

bae7b3d588e25d54fb2048873821fe46.png

所以不加volatile 正常情况下不会发生问题,但是仍有极小概率会出事,保险起见还是加了吧。

当然,我讲的比较浅,个人又比较菜,还在学习中,我觉得我还可以抢救一下,有错的地方多多包容一下,请帮我指正,想再深入的小伙伴可以搜索下volatile的原理


http://www.niftyadmin.cn/n/3437278.html

相关文章

JAVA常用类之包装类

JAVA语言包装类把基本数据类型转换为对象。每个JAVA基本类型在java.lang包中都有一个相应的包装类。 基本类型包装类booleanBooleanbyteBytecharCharactershortShortintIntegerlongLongfloatFloatdoubleDouble包装类的构造方法 每个包装类都有几种重载形式,以Double…

通信时MTU的获得和路径MTU

由于以太网物理性质的限制,我们在IP层发送数据的时候, 如果发送向物理层的数据包大于物理层的限制, 就会发生错误. 该物理层限制就叫做MTU. 而在网络传输中, 每一条传输线路都有可能有自己不同的传输限制, 虽然路由器可以在IP层进行数据包分片传输, 但是有IP层进行的分片传输, …

Memory Pool 预习知识-Windows内存管理

<<这不是原创&#xff0c;是老文&#xff0c;Pankaj Garg写的&#xff0c;看后翻译了一下&#xff0c;原文可以在http://www.intellectualheaven.com/找到。>>1 介绍Windows 32位 x86 操作系统最多能访问4GB的物理内存。这是因为处理器的寻址总线是32条&#xff08…

java时间格式化错误_Java中日期格式化YYYY-DD的操作bug

写这篇博文是记录下跨年的bug。去年隔壁组的小伙伴就是计算两个日期之间间隔的天数&#xff0c;因为跨年的原因计算有误。当时测试组的小姐姐也没有模拟出来这种场景&#xff0c;导致上生产环境直接影响线上的数据。今天逛技术论论坛正好遇到Java日期的操作bug。1 yyyy 和 YYYY…

智能指针shared_ptr为什么会造成循环引用

循环引用是什么 循环引用是因为智能指针对象所管理的A类型的对象中, 含有指向该A类型对象的智能指针对象 可能会有点绕口, 请注意区分A类型的对象 和 智能指针对象 因为A类型对象 甲中的智能指针对象指向了另外一个A类型对象 乙, 而另外一个A类型对象 乙中的只能指针对象也指向…

MySQL 5.1.38

完全安装包http://mysql.isu.edu.tw/Downloads/MySQL-5.1/mysql-5.1.38-win32.msi包含了安装MySQL所需要的全部文件与配置向导以及可选组件&#xff0c;如基准套件和嵌入式服务器 基本安装包http://mysql.isu.edu.tw/Downloads/MySQL-5.1/mysql-essential-5.1.38-win32.msi只包…

【数据结构+算法】【模拟法】--- 螺旋矩阵填数

【题目描述】在一个n * n的矩阵中按照螺旋样式填入从1一直到n * n的一串整数&#xff0c;下面是当n 4时的矩阵&#xff1a;1 2 3 4 12 13 14 511 16 15 610 9 8 7 现在给出矩阵的边长n&#xff0c;直接输出该矩阵。【输入】一个整数&#xff0c;即矩阵的边长n。&#xff08;n …

mysql 编码转换函数_MySQL字符集及MySQL编码转换

时间&#xff1a;2006-05-14 14:39:11类别&#xff1a;技术访问&#xff1a;7907今天找到这篇文章&#xff0c;里面提到从latin1到UTF8的MySQL编码转换。收藏一下&#xff0c;最近要将所有的数据库都转一次&#xff0c;一直错误的使用latin1&#xff0c;再不转以后麻烦大了。出…