错误示例

public class DoubleCheckedLocking {/*** 单例.*/private static Instance instance;/*** 获取单例.* @return 对象.*/public static Instance getInstance() {if (instance == null) {synchronized (DoubleCheckedLocking.class) {if (instance == null) {instance = new Instance(); // 问题根源.}}}return instance;}
}

问题根源

instance = new Instance(); 指令重排序

期望顺序

memory = allocate(); //1、分配对象的内存空间
ctorInstance(memory);//2、初始化对象
instance = memory;   //3、设置instance 指向内存地址

可能重排序

memory = allocate(); //1、分配对象的内存空间
instance = memory;   //3、设置instance 指向内存地址
// !!!注意:此时对象还未初始化
ctorInstance(memory);//2、初始化对象

解决方案

1、volatile 域

2、类的初始化

1、volatile 域

 /*** 单例.*/private static volatile Instance instance;

2、类的初始化

 /*** 单例.*/private static Instance instance = new Instance();

JMM设计原理之双重检查Lock相关推荐

  1. DoubleCheck双重检查实战及原理解析

    那这种方式兼顾了性能和线程安全,而且也是懒加载的,那现在我们来创建一个类,这个类名也是懒加载的,双重检查首先从上至下是一个时间,线程0,因为刚刚呢,我们debug的时候,是从0开始的,所以现在演示的是 ...

  2. 99%的人没弄懂volatile的设计原理,更别说灵活运用了

    写volatile的文章非常多,本人也看过许多相关文章,但始终感觉有哪里不太明白,但又说不上来说为什么.可能是过于追求底层实现原理,老想问一个为什么吧. 而写这篇文章的目的很简单,就是突然之间明白了v ...

  3. 【Java并发编程(一)】并发设计原理

    一.并发设计原理 1. 基本概念 1.1 并发和并行 1.2. 同步 同步方式有两种: 控制同步:当一个任务的开始依赖于另一个任务的结束时,第二个任务不能在第一个任务完成之前开始. 数据访问同步:当两 ...

  4. C++ 从双重检查锁定问题 到 内存屏障的一些思考

    文章目录 1. 问题描述 2. DCLP 的问题 和 指令执行顺序 2.1 Volatile 关键字 2.2 C++11 的内存模型 3. C++11内存模型 解决DCLP问题 3.1 内存屏障和获得 ...

  5. java双重检查锁单例真的线程安全吗?

     相信大多数同学在面试当中都遇到过手写单例模式的题目,那么如何写一个完美的单例是面试者需要深究的问题,因为一个严谨的单例模式说不定就直接决定了面试结果,今天我们就要来讲讲看似线程安全的双重检查锁单例模 ...

  6. C++11 修复了双重检查锁定问题(转)

    从网上看到了一篇这个文章,收藏一下 导读:本文是关于C++11标准中修复了双重检查锁定模式的消息,同时作者阐述了实现双重检查锁定模式的诸多方法,并逐一进行了分析,作者还提供了一个在早期编译器上实现双重 ...

  7. 双重检查锁单例模式为什么要用volatile关键字?

    前言 从Java内存模型出发,结合并发编程中的原子性.可见性.有序性三个角度分析volatile所起的作用,并从汇编角度大致说了volatile的原理,说明了该关键字的应用场景:在这补充一点,分析下v ...

  8. 双重检查锁为什么要使用volatile字段?

    前言 从Java内存模型出发,结合并发编程中的原子性.可见性.有序性三个角度分析volatile所起的作用,并从汇编角度大致说了volatile的原理,说明了该关键字的应用场景:在这补充一点,分析下v ...

  9. 一文搞懂go并发编程设计原理

    前言 主要学习其设计原则,大体流程,权衡利弊 不要纠结于部分难懂的实现细节,因为不同的人对相同接口的实现细节不一样,就算是相同的人实现两次也可能不一样 context context的作用主要有两个: ...

最新文章

  1. 5、Linux-Mac配置环境变量
  2. Android基础——四大组件之Activity
  3. MySQL学习笔记06【多表查询、子查询、多表查询练习】
  4. C语言试题六十五之请编写函数实现猴子吃桃问题
  5. iou画 yolov3_专栏 | 【从零开始学习YOLOv3】4. YOLOv3中的参数进化
  6. 剑指offer 最小的k个数 leetcode 215. Kth Largest Element in an Array
  7. 【ASP.NET MVC 学习笔记】- 18 Bundle(捆绑)
  8. jQuery获取表单数据
  9. 计算机楼综合布线设计图,现代综合大楼综合布线设计方案
  10. 取消全部呼叫转移代码_中国移动的卡取消呼叫转移的快捷方式是什么?
  11. excel打不开xlsx文件怎么办?
  12. 运营商精准大数据——主动出击 精准获客_客户_实时数据
  13. 说说Pluma插件管理框架
  14. 流量充值解决方案(附代码)
  15. 【Android】DeepLink跳转简介
  16. 15k运维面试题带答案分享
  17. 大厂面试题Object object = new Object()
  18. Html内外宽度已经清除浮动基础笔记
  19. 编译搭建ngrok服务实现内网穿透
  20. HTML实现狗屁不通文章生成器

热门文章

  1. 论文浅尝 - ACL2020 | Segmented Embedding of Knowledge Graphs
  2. 论文浅尝 | 引入“引用”的语言模型
  3. Java面试知识点:File、IO流
  4. python 经典排序算法
  5. python数据分析笔记中panda(2)
  6. [leetcode]Decode Ways
  7. 我是新人我最强----团队新手培训计划展开
  8. CAP 理论 —— 最通俗的解释
  9. hadoop单机配置(非分布式)
  10. Tensorflow深度学习应用(进阶篇)