当前位置:网站首页>单例模式(双检锁)
单例模式(双检锁)
2022-07-27 00:13:00 【锐湃】
使用DCL双检索模式:
代码如下:
package SingLeton_pattern;
//import static com.sun.org.apache.xalan.internal.xsltc.compiler.util.Type.String;
//双检锁/双重校验锁(DCL,即 double-checked locking)
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;
}
}
下面的代码在多线程环境下不是原子执行的:
singleton = new Singleton();正常的底层执行顺序会转变成三步:
(1) 给Singleton类的实例singleton分配内存
(2) 调用实例singleton的构造函数来初始化成员变量
(3) 将singleton指向分配的内存地址上面的三步,无论在A线程当前执行到那一步骤,对B线程来说可能看到A的状态只能是两种1,2看到的都是null,3看到的非null,这是没问题的。
但如果出现了指令重排,即(3)先执行了,那么 B 线程那么在第一个null的检查的时候,就有可能看到这个实例不是null,这时候直接拿来使用就会出现问题。
所以这里使用:
volatile禁止了指令重排序,所以确保了初始化顺序一定是1->2->3,所以也就不存在拿到未初始化的对象引用的情况。用了volatile修饰成员变量,那么在变量赋值之后,会有一个内存屏障。也就说只有执行完1,2,3步操作后,读取操作才能看到,读操作不会被重排序到写操作之前。
在《深入理解Java虚拟机》一书中有描述:
“观察加入volatile关键字和没有加入volatile关键字时所生成的汇编代码发现,加入volatile关键字时,会多出一个lock前缀指令”
lock前缀指令实际上相当于一个内存屏障(也成内存栅栏),内存屏障会提供3个功能:
优点:
保持了DCL,比较简单
确定:volatile这个关键字多少会带来一些性能影响吧。
————————————————
版权声明:本文为CSDN博主「大鱼qss」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_37857292/article/details/124566044
边栏推荐
- C language: deep learning recursion
- C语言程序的编译(预处理)下
- com.fasterxml.jackson.databind.exc.InvalidDefinitionException
- Database knowledge required by testers: MySQL common syntax
- Why do people like to rank things
- [nisactf 2022] upper
- Information collection port scanning tool nmap instructions
- Mysql 5.7 取分组第一条
- Static keyword
- 【RYU】安装RYU常见问题及解决办法
猜你喜欢

C language: deep learning recursion

哈希表与一致性哈希的原理理解以及应用

数据资产管理的概念

中断、信号、系统调用

JMeter interface test, quickly complete a single interface request

ArduinoUNO驱动RGB模块全彩效果示例

Interrupt, signal, system call

Getlocation:fail the API need to be declared in the requiredprivateinfo field in app.json

How to do the system security test? Let's talk about it in detail

次轮Okaleido Tiger即将登录Binance NFT,引发社区热议
随机推荐
Rust Web(一)—— 自建TCP Server
Arduinouno drive RGB module full color effect example
Getlocation:fail the API need to be declared in the requiredprivateinfo field in app.json
测试人需要的数据库知识:MySQL常用语法
Interrupt, signal, system call
Why do people like to rank things
Okaleido Tiger 7.27日登录Binance NFT,首轮已获不俗成绩
[NISACTF 2022]上
听说你们面试都跪在了接口测试上?
次轮Okaleido Tiger即将登录Binance NFT,引发社区热议
聊聊连接池和线程
使用 WebSocket 实现一个网页版的聊天室(摸鱼更隐蔽)
com.fasterxml.jackson.databind.exc.InvalidDefinitionException
【无标题】
白盒测试案例设计(我爷爷都能看懂)
[Li Kou] 1859. Sort sentences
系统安全测试要怎么做,详细来说说
idea中常用的快捷键
#博客大赛# 斗胆尝试浅入门之BAC
LeetCode->二分查找打卡