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