摘要:前半句是指線程內(nèi)表現(xiàn)為串行的語義,后半句是指指令重排序現(xiàn)象和工作內(nèi)存和主內(nèi)存同步延遲現(xiàn)象。關(guān)于內(nèi)存模型的講解請參考死磕同步系列之。目前國內(nèi)市面上的關(guān)于內(nèi)存屏障的講解基本不會(huì)超過這三篇文章,包括相關(guān)書籍中的介紹。
問題(1)volatile是如何保證可見性的?
(2)volatile是如何禁止重排序的?
(3)volatile的實(shí)現(xiàn)原理?
(4)volatile的缺陷?
簡介volatile可以說是Java虛擬機(jī)提供的最輕量級的同步機(jī)制了,但是它并不容易被正確地理解,以至于很多人不習(xí)慣使用它,遇到多線程問題一律使用synchronized或其它鎖來解決。
了解volatile的語義對理解多線程的特性具有很重要的意義,所以彤哥專門寫了一篇文章來解釋volatile的語義到底是什么。
語義一:可見性前面介紹Java內(nèi)存模型的時(shí)候,我們說過可見性是指當(dāng)一個(gè)線程修改了共享變量的值,其它線程能立即感知到這種變化。
關(guān)于Java內(nèi)存模型的講解請參考【死磕 java同步系列之JMM(Java Memory Model)】。
而普通變量無法做到立即感知這一點(diǎn),變量的值在線程之間的傳遞均需要通過主內(nèi)存來完成,比如,線程A修改了一個(gè)普通變量的值,然后向主內(nèi)存回寫,另外一條線程B只有在線程A的回寫完成之后再從主內(nèi)存中讀取變量的值,才能夠讀取到新變量的值,也就是新變量才能對線程B可見。
在這期間可能會(huì)出現(xiàn)不一致的情況,比如:
(1)線程A并不是修改完成后立即回寫;