volatile解释
作者:互联网
前言
并发编程中的三大特性:
- 原子性:一个或者多个操作,要么全部执行,要不全都不执行;而且执行中途不能被中断,如果被中断,则要进行回滚。
- 可见性:多个线程共同访问共享变量时,如果此时有某个线程修改了此变量,其他线程中的该变量的缓存会立刻失效,并且重新从内存中缓存修改后的值。
- 有序性:程序执行代码的顺序,共享内存模型(JMM)允许编译器和处理器提高执行效率,对代码执行的顺序进行调整和优化,在单线程的情况下,指令重排不会影响执行的结果,但是多线程的情况下,可能会出现不一样的结果。
synchronize 关键字同时保证了以上三种特性。
volatitle
volatitle只保证了可见性和有序性,但是无法保证原子性,所以利用 volatitle 实现同步比 synchronized 执行所需要的消耗要小,volatitle 不会引起上下文的切换和调度。
volatitle 可见性
共享内存模型(JMM)中规定,所有的变量都是储存在主内存中,每个线程都有自己的工作内存,每个线程的工作内存中的变量都是主内存变量的副本。线程对变量的读和写都只能在各自的工作内存中进行,不能直接读、写主内存中的变量,并且每个线程的工作内存是线程私有。
对于普通共享变量,线程A修改了变量之后,主内存中的值什么时候被更新无法得知,此时线程B读取了自己工作内存中的该变量,则读取到的是一个修改前的值,出现了线程不安全问题。
如果该变量被volatitle修饰,则会引起一系列不同的变化:
- 如果某个线程修改了被volatitle修饰的变量,则操作系统会强制将线程工作内存中的修改后的变量立即写回主内存中;
- 并且会使其他线程的工作内存中该变量的副本会失效,如果其他线程想要再使用该变量,只能先从主内存中得到最新的该变量的副本拷贝到线程私有的工作内存再使用。
volatitle 有序性
volatitle 是通过在javac编译java文件生成class字节码文件的时候,在指令序列中添加“内存屏障”来禁止指令重排序 。
字节码文件中,被volatitle修饰的变量会加入标志ACC_VOLATILE。
JVM的实现会在volatile读写前后均加上内存屏障,在一定程度上保证有序性。如下所示:
LoadLoadBarrier
volatile 读操作
LoadStoreBarrier
StoreStoreBarrier
volatile 写操作
StoreLoadBarrier
标签:解释,变量,volatitle,线程,内存,有序性,volatile 来源: https://blog.csdn.net/weixin_44355752/article/details/115420002