摘要:前半句是指線程內表現為串行的語義,后半句是指指令重排序現象和工作內存和主內存同步延遲現象。關于內存模型的講解請參考死磕同步系列之。目前國內市面上的關于內存屏障的講解基本不會超過這三篇文章,包括相關書籍中的介紹。
問題(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并不是修改完成后立即回寫;