关于关键字volatile的一二

简介: 关于关键字volatile的一二

volatile关键字一般用来修饰变量。

被volatile修饰的变量可以保证可见性和防止指令重排序,但是无法保证变量的原子性。


什么是可见性,在JVM中,变量都存在主内存中,每个线程都有一个工作内存,工作内存中存放着该线程中要使用的变量。变量的值与是主内存的变量值的拷贝。


当其中一个线程的的工作内存中的变量发生改变时,按理说应该马上将改变后的变量值更新到主内存中,这样其他线程在使用这个变量的时候,拿到的就是该变量最新的值。但是这个将新的变量值更新到主内存的操作,并不知道是什么时候执行,导致其他线程要从主内存中读取变量值的时候,拿到的不是最新的值。会出现数据问题。

而使用volatile修饰的变量,在工作内存变量的值进行写操作后,强制将工作内存中的值刷新的到主内存中,其他线程中存放的变量置为无效,然后从主内存中获取变量的最新值,放在工作内存中。


什么是指令重排序,java代码在经过jvm编译之后,实际运行的时候,在不违反变量之间的依赖的情况下,代码的运行顺序可能不会和写代码的顺序一致。

代码的顺序一致。

举例:

1 int a = 3;
2 int b = 4;
3 int c = a * b;

在实际运行的过程中,第二行可能会放在第一行之前执行,因为它们之前没有依赖,改变执行顺序不会对其他地方造成影响。

但是第三行一定要放在第三行,不能在一二行之前,因为c是依赖a和b的变量的。

volatile 修饰的变量,会禁止这种重排序以避免多线程情况下变量的值会混乱。

目录
相关文章
|
编译器
C零散知识点汇总之volatile关键字
C零散知识点汇总之volatile关键字
|
编译器 C语言
C语言程序设计——volatile关键字、函数重入
C语言程序设计——volatile关键字、函数重入
156 0
C语言程序设计——volatile关键字、函数重入
|
安全 Java
关于关键字transient的一二
关于关键字transient的一二
88 0
|
SQL 缓存 安全
Java并发编程学习系列七:深入了解volatile关键字
Java并发编程学习系列七:深入了解volatile关键字
133 0
Java并发编程学习系列七:深入了解volatile关键字
|
Java
Java多线程学习(三)volatile关键字
欢迎关注我的微信公众号:**“Java面试通关手册”**(分享各种Java学习资源,面试题,以及企业级Java实战项目回复关键字免费领取)。另外我创建了一个Java学习交流群(群号:**174594747**),欢迎大家加入一起学习,这里更有面试,学习视频等资源的分享。
1894 0
|
8月前
|
缓存 安全 Java
深入理解java中的volatile关键字
深入理解java中的volatile关键字
152 1
|
缓存 Java 编译器
Java并发编程学习笔记:volatile关键字解析
Java并发编程学习笔记:volatile关键字解析
|
缓存 Java
面试官最爱的volatile关键字
在Java相关的岗位面试中,很多面试官都喜欢考察面试者对Java并发的了解程度,而以volatile关键字作为一个小的切入点,往往可以一问到底,把Java内存模型(JMM),Java并发编程的一些特性都牵扯出来,深入地话还可以考察JVM底层实现以及操作系统的相关知识。
1380 0

热门文章

最新文章