`

volatile指令重排序理解

 
阅读更多
volatile优点:可见性,防止指令重排序,那如何理解指令重排序呢

从一问题开始Object object = new Object();object不为null,如何理解与解释呢
答:类加载过程分为:加载,验证,准备,解析,初始化。其中在准备阶段是给类分配内存,赋予默认值,后续进行初始化,这时object指向内存地址,是不为空的,只是地址所在的内存实际值是空。
object = new Object()分为三布:
1分配空间内存, mem = 空间;
2创建对象new Object(),调用构造初始化对象 ctorSingleton(instance);
3将地址赋给变量(将引用指向存储空间)instance = mem;
这个过程2.3不保证顺序
此问题也会引申:
双检锁的单例模式为什么需要将变量用volatile修饰。
这时候就是上面的对象,一个线程初始化为对象分为三步,理想是123,不加volatile可能会指令重排序,13走完2没走,然后线程切换,这时候单例就没有构造初始化成功,但是其他线程发现对象不为null,于是进去,又得到这个未被初始化的实例使用,导致报错。
volatile底层实现原理是
当前线程变更都会到主内存。
分享到:
评论

相关推荐

    深入理解java内存模型

    处理器重排序与内存屏障指令 happens-before 重排序 数据依赖性 as-if-serial 语义 程序顺序规则 重排序对多线程的影响 顺序一致性 数据竞争与顺序一致性保证 顺序一致性内存模型 同步程序的顺序一致性效果 未同步...

    深入理解Java内存模型.程晓明(带书签文字版).pdf

    处理器重排序与内存屏障指令 7 happens-before 10 重排序 13 数据依赖性 13 as-if-serial 语义 13 程序顺序规则 15 重排序对多线程的影响 15 顺序一致性 19 数据竞争与顺序一致性保证 19 顺序一致性内存模型...

    深入理解Java内存模型

    Agenda: •什么是Java内存模型JMM •内存可见性 •有序性 •指令重排序 •内存屏障 •顺序一致性与Happens-before规则 •volatile, synchronized, 原子变量,锁, final的原理

    深入理解JVM内存结构及运行原理全套视频加资料.txt

    2019最新深入理解JVM内存结构及运行原理(JVM调优)高级核心课程视频教程... 第107讲 重排序问题 00:23:19  第108讲 锁的内存语义 00:13:54  第109讲 volatile的内存语义 00:12:04  第110讲 final域内存语义

    C语言进阶-牟海军.pdf

    简介: C语言是编程语言中的一朵奇葩,虽已垂垂老矣,但却屹立不倒,... 时间复杂度、冒泡排序法、选择排序法、快速排序法、归并排序法、顺序排序法、二分查找等常用算法的详细讲解;  良好的编码习惯和编程风格。

    C语言进阶 作者 Wrestle.Wu

    C语言是编程语言中的一朵奇葩,虽已垂垂老矣,但却屹立不倒,诞生了... 时间复杂度、冒泡排序法、选择排序法、快速排序法、归并排序法、顺序排序法、二分查找等常用算法的详细讲解;  良好的编码习惯和编程风格。

    汪文君高并发编程实战视频资源下载.txt

    │ 高并发编程第二阶段09讲、指令重排序,happens-before规则精讲.mp4 │ 高并发编程第二阶段10讲、volatile关键字深入详解.mp4 │ 高并发编程第二阶段11讲、volatile关键字总结.mp4 │ 高并发编程第二阶段12讲...

    C#5.0本质论第四版(因文件较大传的是百度网盘地址)

    19.1.5 将字段声明为volatile 570 19.1.6 使用System.Threading.Interlocked类 570 19.1.7 多个线程时的事件通知 571 19.1.8 同步设计最佳实践 572 19.1.9 更多的同步类型 573 19.1.10 ...

Global site tag (gtag.js) - Google Analytics