开篇
在Java中开启两个线程A、B。在线程A发生修改的时候B是没有办法及时收到A所做出的修改的,这是因为在我们开启线程的时候优先访问的是本地内存。在开启线程后首次访问一个公共变量的时候,它会先从主内存加载到加载到本地内存中,再从本地内存访问。这样就导致了线程间做出的修改其他的线程没有办法及时收到。
我们可以靠一张图了解一下:
在我们做出了修改后也是先在本地内存中做出了修改后再,同步到主内存中。
volatile
大家都知道在Java中有解决这种问题的关键字 volatile 关键字专门用来解决这种问题。对变量使用了 volatile 关键字后就可以让线程间的修改立刻同步,这是其实是通过内存屏障来实现的。所以 volatile不能够对重排序进行约束还可以让,线程间的修改可以立刻知道
内存屏障
常见的内存屏障有很多,比如不能读、写操作不能够超越这条屏障。而使用 volatile 关键字的时候就会在它的周围实现内存屏障。
- 读 volatile 关键字修改的变量时候:在读的前面加上读屏障,在读的前面加上写屏障
- 写 volatile 关键字修改的变量时:在写的前面加上写屏障,在写的后面加上读&写屏障(StoreLoad)
在程序遇到内存屏障的时候会将本地内存置为无效,然后从主内存中获取到最新的值,这样在我们每次操作 volatile 修改的值的时候它其实都是获取到最新的值