前言
在之前提到:
通过引入并发来优化执行效率的同时引入了其他问题:
- 对共享资源的处理无法保证原子性
- 顺序问题 1. 处理器乱序执行指令在多线程下出问题,2. 多个线程需要顺序执行某个操作
- 可见性 Java的内存模型(工作内存的出现引入了缓存,缓存导致数据的可见性出现问题)
volatile 的作用在于保持相关操作的顺序来实现可见性与有序性。
- 保证可见性: 实现读写有序,在读数据之前一定将最新的当前当前数据在主内存刷新
- 保证有序性: 是可见性的实现基础,即对读写有序的底层保障,不允许重排序,严格有序。
先行发生原则中 volatile的描述
保证可见性
变量修改对其他线程立即可见
可见性问题
https://www.pdai.tech/md/java/thread/java-thread-x-key-volatile.html#%E5%AE%9E%E7%8E%B0%E5%8F%AF%E8%A7%81%E6%80%A7
可见性问题主要指一个线程修改了共享变量值,而另一个线程却看不到。引起可见性问题的主要原因是每个线程拥有自己的一个高速缓存区——线程工作内存。volatile关键字能有效的解决这个问题,我们看下下面的例子,就可以知道其作用:
public class VolatileTest {
int a = 1;
int b = 2;
public void change(){
a = 3;
b = a;
}
<