当前位置:网站首页>多线程复习总结之解析Volatile关键字
多线程复习总结之解析Volatile关键字
2022-06-11 07:09:00 【--流星。】
引言
在了解volatile之前,首先需要了解java的内存模型。
Java内存模型(JMM)
在 JDK1.2 之前,Java 的内存模型实现总是从主存(即共享内存)读取变量,是不需要进行特别的注意的。但是在当前的 Java 内存模型下,线程把变量保存在本地内存(比如机器的寄存器)中,而不是直接在主存中进行读写。这就可能造成一个线程在主存中修改了一个变量的值,而另外一个线程还继续使用它在寄存器中的变量值的拷贝,从而导致数据的不一致问题。
要解决这个问题,就需要把变量声明为volatile,表明告诉 JVM 说,这个变量是共享且不稳定的,每次使用它都到主存中进行读取。【即保证变量的可见性】
并发编程的三个重要特性
原子性 : 一个操作或者多个操作,要么全部执行并且执行的过程不会被任何因素打断,要么就都不执行。(
synchronized+lock可以保证代码片段的原子性)
可见性 :当一个变量对共享变量进行了修改,那么另外的线程都是立即可以看到修改后的最新值。(
volatile关键字可以保证共享变量的可见性)
有序性 :程序执行的顺序按照代码的先后顺序执行。(
volatile关键字可以禁止指令进行重排序优化)
【注】在Java内存模型中,允许编译器和处理器对指令进行重排序,但是重排序过程不会影响到单线程程序的执行,却会影响到多线程并发执行的正确性。
volatile的原理和实现机制
“观察加入volatile关键字和没有加入volatile关键字时所生成的汇编代码发现,加入volatile关键字时,会多出一个lock前缀指令”
lock前缀指令实际上相当于一个内存屏障(也成内存栅栏),内存屏障会提供3个功能:
- 它确保指令重排序时不会把其后面的指令排到内存屏障之前的位置,也不会把前面的指令排到内存屏障的后面
- 它会强制将对缓存的修改操作立即写入主存;
- 如果是写操作,它会导致其他CPU中对应的缓存行无效。
volatile使用场景
synchronized关键字是防止多个线程同时执行一段代码,但是会很影响程序执行效率。
而volatile关键字在某些情况下性能要优于synchronized,但是volatile关键字是无法替代synchronized关键字的,因为volatile关键字无法保证操作的原子性。
通常来说,使用volatile必须具备以下2个条件:
1)对变量的写操作不依赖于当前值
2)该变量没有包含在具有其他变量的不变式中
附:参考资料
边栏推荐
- Atom, the top stream editor, will leave the historical stage on December 15
- 生物序列智能分析平台blog(1)
- Group arrays by a specified size
- 【迅为干货】龙芯2k1000开发板opencv 测试
- 【CF】 A. New Year Candles
- P3327 [sdoi2015] approximate sum (Mobius inversion + formula)
- QT 基于QScrollArea的界面嵌套移动
- Completed in May, 22
- The meaning and research significance of mathematical methodology
- mybaits-puls 在xml文件中写sql语句 会报错 Invalid bound statement (not found):
猜你喜欢

生物序列智能分析平台blog(1)

Shutter restraint container assembly

Whether the ZABBIX monitoring host is online

The gap between the parent box and the child box

Senior openstacker - Bloomberg, vexxhost upgraded to the Gold member of openinfra Foundation

@JsonProperty注解

Menu double linkage effect in uniapp

Records how cookies are carried in cross domain requests

The rotation of the earth and the moon (II)

Nodejs database (Part 2)
随机推荐
Bat (batch processing) processing special symbols (exclamation point, percent sign), etc
正则表达式匹配
Detailed explanation of mutationobserver
Modular notes
About daily report plan
Duality-Gated Mutual Condition Network for RGBT Tracking
Leetcode-9.Palindrome Numbber
webserver
. Net C Foundation (6): namespace - scope with name
资深OpenStacker - 彭博、Vexxhost升级为OpenInfra基金会黄金成员
Matplotlib,设置坐标刻度大小,字体/设置图例大小及字体/设置纵横坐标名称及字体及大小
Interview question 02.06 Palindrome linked list
教育专家王中泽老师:家庭教育重在自己成长
1269. number of options left in place
Phi and phi (Mobius inversion + formula)
Transformer Tracking
Web API、DOM
[Xunwei dry goods] opencv test of Godson 2k1000 development board
matplotlib的cmap
Cv2.rectangle() picture frame

