volatile与synchronized
作者:互联网
volatile与synchronized的区别
1,volatile不会造成线程的阻塞,synchronized会。
2,synchronized会 造成线程状态的改变,而线程状态的改变又依赖于操作系统,所以效率会比较低。
3,synchronized可以修饰代码块、方法。volatile只能修饰变量。
4,synchronized能保证原子性、volatile不能。
5,volatile本质是在告诉jvm当前变量在寄存器(工作内存)中的值是不确定的,需要从主存中读取; synchronized则是锁定当前变量,只有当前线程可以访问该变量,其他线程被阻塞住。
6)使用volatile而不是synchronized的唯一安全情况是类中只有一个可变的域。
volatile
当一个变量定义为volatile后,它将具备两种特性:1. 可见性,2. 禁止指令重排序。
首先,我们要意识到有这样的现象:编译器为了加快程序运行速度,对一些变量的写操作会现在寄存器或CPU缓存上进行,最后写入内存。而在这个过程中,变量的新值对其它线程是不可见的。
可见性:当对volatile标记的变量进行修改时,会将其它缓存中存储的修改前的变量清除,然后重新读取。这里从哪读尚未明确,一般来说应该是先在进行修改的缓存A中修改为新值,然后通知其它缓存清除掉此变量,当其它缓存B中的线程读取此变量时,会向总线发送消息,这是存储新值的缓存A获取到消息,将新值传给B,最后将新值写入内存。
A),在修改变量的过程中
- 将修改变量的副本写入主内存
- 其他线程的 副本置为无效
B),读的时:先判断volatile关键字修饰的变量是否有效,有效直接读取,反之,则 到主内存获取最新值
volatile的作用是被其修饰的变量每次刷新时,都会刷新上述步骤。
有序性(能禁止指令重排序)
1)当程序执行到volatile变量的读操作或者写操作时,在其前面的操作的更改肯 定全部已经进行,且结果已经对后面的操作可见;在其后面的操作肯定还没有进行;
2)在进行指令优化时,不能将在对volatile变量访问的语句放在其后面执行,也 不能把volatile变量后面的语句放到其前面执行。
原文:https://blog.csdn.net/qq_37937537/article/details/82764667
标签:缓存,变量,synchronized,新值,线程,volatile 来源: https://blog.csdn.net/weixin_43751710/article/details/91049267