多线程单例安全----双重校验锁+volatile
发布日期:2022-04-11 08:52:59
浏览次数:19
分类:技术文章
本文共 393 字,大约阅读时间需要 1 分钟。
双重校验锁
上图单线程安全。
先判断null如果为null再尝试获取锁(提高性能,如果已经创建就不用加锁判断了),获取锁后还不能直接创建,因为之前可能也有判断为null的已经获取过锁并创建对象,所以锁内需要再次检测。两次的if判断与synchronized称为双重校验锁。
为什么要加volatile
因为在上述if判断即使加锁了还是可能出错。
new可分为几步
1、检查类是否加载
2、分配内存
3、变量赋默认值
4、设置对象头
5、执行初始化方法
简单说,先分配内存,再执行构造器方法,最后引用赋值给变量。
由于指令会重排序后两步可能颠倒导致多线程下在对象进行分配内存、变量赋值还未初始化时就被使用。
volatile两个作用
1、多线程下保证可见性
2、禁止指令重排序
volatile 禁止对象创建时指令之间重排序,所以其他线程不会访问到一个未初始化的对象,从而保证安全性
参考
转载地址:https://blog.csdn.net/weixin_45875621/article/details/123396047 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!
发表评论
最新留言
路过按个爪印,很不错,赞一个!
[***.219.124.196]2024年04月03日 18时15分01秒
关于作者
喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
【爬虫】简单十行代码爬取B站的B站弹幕
2019-04-28
Servlet 体系结构
2019-04-28
Java笔记—语法
2019-04-28
Java笔记—数组
2019-04-28
Java笔记—继承
2019-04-28
MySQL的数据类型
2019-04-28
洛谷 P1886 滑动窗口 /【模板】单调队列
2019-04-28
洛谷 P3367 【模板】并查集
2019-04-28
【算法学习】高级数据结构2 种类并查集
2019-04-28
洛谷 P1525 关押罪犯【种类并查集】
2019-04-28
洛谷 P2024 [NOI2001]食物链【种类并查集】
2019-04-28
POJ 1703 Find them, Catch them【种类并查集】
2019-04-28
POJ 2492 A Bug‘s Life【种类并查集】
2019-04-28
POJ 2236 Wireless Network【并查集】
2019-04-28
LeetCode C++ 214. Shortest Palindrome【字符串】困难
2019-04-28
洛谷 P2580 于是他错误的点名开始了【字典树/Map】
2019-04-28
HDU 3336 Count the string【KMP的next数组性质】
2019-04-28
洛谷 P1196 [NOI2002]银河英雄传说【带权并查集】
2019-04-28
HDU 4825 Xor Sum【01字典树/贪心】(两数最大/最小异或和)
2019-04-28