当前位置:网站首页>多线程复习总结之解析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)该变量没有包含在具有其他变量的不变式中
附:参考资料
边栏推荐
- 二、用户登录和注册
- mybaits-puls 在xml文件中写sql语句 会报错 Invalid bound statement (not found):
- R语言并行计算实战教程
- MS office level II wrong question record [7]
- WPF 数据绑定(四)
- Janus feature draft
- Adventure of small X
- Shangtang technology has actively resumed work and will vigorously invest in the capacity and deployment of the digital sentry
- Latex various arrows / arrows with text labels / variable length arrows
- webserver
猜你喜欢

QT 基于QScrollArea的界面嵌套移动

Biological sequence intelligent analysis platform blog (1)

Education expert wangzhongze shared his experience for many years: family education is not a vassal

1、 Sqlserver2008 installation (with password), database creation, C form project test

The difference between arrow function and ordinary function

资深OpenStacker - 彭博、Vexxhost升级为OpenInfra基金会黄金成员

Difference between byte and bit

模块化笔记

二、用户登录和注册
![[advanced concurrency] - thread pool summary](/img/69/dc8146dafc30f8a8efa012b67aa05c.png)
[advanced concurrency] - thread pool summary
随机推荐
Outer margin collapse
Prototype and prototype chain
Analysis of key points and difficulties of ES6 promise source code
Atomicinteger atomic operation class
Matplotlib,设置坐标刻度大小,字体/设置图例大小及字体/设置纵横坐标名称及字体及大小
Experience record of rural housing integration script
Matplotlib, set coordinate scale size, font / set legend size and font / set vertical and horizontal coordinate name, font and size
Web API、DOM
Library management system 1- project approval
Education expert wangzhongze shared his experience for many years: family education is not a vassal
Leetcode-647. Palindromic Substrings
webserver
Heartless sword Chinese English bilingual poem 001 Love
Promises/a+ standard Chinese Translation
The difference between arrow function and ordinary function
Atom, the top stream editor, will leave the historical stage on December 15
Leetcode-141. Linked List Cycle
Senior openstacker - Bloomberg, vexxhost upgraded to the Gold member of openinfra Foundation
【CF #277.5 (Div. 2)】B. BerSU Ball
[matlab WSN communication] a_ Star improved leach multi hop transmission protocol [including source code phase 487]

