关于关键字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 修饰的变量,会禁止这种重排序以避免多线程情况下变量的值会混乱。

目录
相关文章
|
20天前
|
缓存 编译器 C++
第十五问:volatile是什么?有什么用?
本文深入探讨了C/C++中的`volatile`关键字,解释了其防止编译器不当优化、保证多线程间可见性和确保硬件状态正确读写的作用。同时,文章也指出了使用`volatile`可能带来的性能影响,并强调了它在多线程同步中的局限性。通过具体示例,帮助读者更好地理解和应用这一强大工具。
31 0
|
4月前
|
存储 缓存 Java
volatile关键字最全原理剖析
【9月更文挑战第27天】`volatile` 是一个用于修饰变量的关键字,告知编译器被修饰的变量可能在程序控制流之外被改变。在多线程环境下,`volatile` 确保变量的值每次从内存中读取,保持最新状态,但不能解决所有同步问题。在硬件交互中,`volatile` 用于内存映射的 I/O 操作,确保读取最新值。不同编程语言如 C/C++ 和 Java 中的 `volatile` 用法略有差异,但都是处理易变变量的重要工具。
|
7月前
|
缓存 安全 Java
深入理解java中的volatile关键字
深入理解java中的volatile关键字
129 1
|
8月前
|
Java 编译器
Java多线程:什么是volatile关键字?
Java多线程:什么是volatile关键字?
63 0
|
安全 Java
关于关键字transient的一二
关于关键字transient的一二
70 0
|
编译器 C语言
C语言程序设计——volatile关键字、函数重入
C语言程序设计——volatile关键字、函数重入
149 0
C语言程序设计——volatile关键字、函数重入
|
编译器
C零散知识点汇总之volatile关键字
C零散知识点汇总之volatile关键字
|
SQL 缓存 安全
Java并发编程学习系列七:深入了解volatile关键字
Java并发编程学习系列七:深入了解volatile关键字
123 0
Java并发编程学习系列七:深入了解volatile关键字
|
存储 缓存 Java
Java并发编程之Volatile关键字解析
在java的并发编程中我们经常会使用到Volatile关键字。而关于Volatile关键字的使用以及Volatile关键字的特性和实现原理也是在笔面试中经常会遇到的问题了。
119 0
Java并发编程之Volatile关键字解析
|
缓存 Java 编译器
Java并发编程学习笔记:volatile关键字解析
Java并发编程学习笔记:volatile关键字解析