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

目录
相关文章
|
2天前
|
缓存 安全 Java
《volatile使用与学习总结:》多层面分析学习java关键字--volatile
《volatile使用与学习总结:》多层面分析学习java关键字--volatile
7 0
|
2天前
|
缓存 Java 编译器
必知的技术知识:Java并发编程:volatile关键字解析
必知的技术知识:Java并发编程:volatile关键字解析
|
1月前
|
Java 编译器
Java多线程:什么是volatile关键字?
Java多线程:什么是volatile关键字?
39 0
|
安全 Java
关于关键字transient的一二
关于关键字transient的一二
49 0
|
安全 Java 编译器
了解Volatile关键字:提升你的并发编程技能
了解Volatile关键字:提升你的并发编程技能
63 0
|
编译器 C语言
C语言程序设计——volatile关键字、函数重入
C语言程序设计——volatile关键字、函数重入
113 0
C语言程序设计——volatile关键字、函数重入
|
编译器
C零散知识点汇总之volatile关键字
C零散知识点汇总之volatile关键字
|
SQL 缓存 安全
Java并发编程学习系列七:深入了解volatile关键字
Java并发编程学习系列七:深入了解volatile关键字
106 0
Java并发编程学习系列七:深入了解volatile关键字
|
存储 缓存 Java
Java并发编程之Volatile关键字解析
在java的并发编程中我们经常会使用到Volatile关键字。而关于Volatile关键字的使用以及Volatile关键字的特性和实现原理也是在笔面试中经常会遇到的问题了。
83 0
Java并发编程之Volatile关键字解析
|
缓存 Java 编译器
Java并发编程学习笔记:volatile关键字解析
Java并发编程学习笔记:volatile关键字解析