赞
踩
这篇文章写的不错
https://mp.weixin.qq.com/s/Oa3tcfAFO9IgsbE22C5TEg
对juc整体做了一个总结,可以了解了解
https://segmentfault.com/a/1190000015558984
volatile保证不同线程对共享变量操作的可见性,也就是说一个线程修改了volatile修饰的变量,当修改写回主内存时,另外一个线程立即看到最新的值。

因为某一个线程进入synchronized代码块前后,线程会获得锁,清空工作内存,从主内存拷贝共享变量最新的值到工作内存成为副本,执行代码,将修改后的副本的值刷新回主内存中,线程释放锁。而获取不到锁的线程会阻塞等待,所以变量的值肯定一直都是最新的。
每个线程操作数据的时候会把数据从主内存读取到自己的工作内存,如果他操作了数据并且写回了,其他已经读取的线程的变量副本就会失效了,其他线程需要操作数据又要再次去主内存中读取。由于Volatile的缓存一致性协议,需要不断的从主内存嗅探和cas不断循环,无效交互会导致总线带宽达到峰值,所以不要大量使用Volatile 。
在一次操作之内,要么全都成功,要么完全失败,可以通过原子类保证原子性
那Volatile是怎么保证不会被执行重排序的呢?--------------内存屏障
java编译器会在生成指令系列时在适当的位置会插入内存屏障来禁止特定类型的处理器重排序。
volatile写操作是在前面和后面分别插入内存屏障,而volatile读操作是在后面插入两个内存屏障。


Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。