摘要:前半句是指线程内表现为串行的语义,后半句是指指令重排序现象和工作内存和主内存同步延迟现象。关于内存模型的讲解请参考死磕同步系列之。目前国内市面上的关于内存屏障的讲解基本不会超过这三篇文章,包括相关书籍中的介绍。
问题(1)volatile是如何保证可见性的?
(2)volatile是如何禁止重排序的?
(3)volatile的实现原理?
(4)volatile的缺陷?
简介volatile可以说是Java虚拟机提供的最轻量级的同步机制了,但是它并不容易被正确地理解,以至于很多人不习惯使用它,遇到多线程问题一律使用synchronized或其它锁来解决。
了解volatile的语义对理解多线程的特性具有很重要的意义,所以彤哥专门写了一篇文章来解释volatile的语义到底是什么。
语义一:可见性前面介绍Java内存模型的时候,我们说过可见性是指当一个线程修改了共享变量的值,其它线程能立即感知到这种变化。
关于Java内存模型的讲解请参考【死磕 java同步系列之JMM(Java Memory Model)】。
而普通变量无法做到立即感知这一点,变量的值在线程之间的传递均需要通过主内存来完成,比如,线程A修改了一个普通变量的值,然后向主内存回写,另外一条线程B只有在线程A的回写完成之后再从主内存中读取变量的值,才能够读取到新变量的值,也就是新变量才能对线程B可见。
在这期间可能会出现不一致的情况,比如:
(1)线程A并不是修改完成后立即回写;