成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

死磕 java同步系列之volatile解析

番茄西紅柿 / 1894人閱讀

摘要:前半句是指線程內(nèi)表現(xiàn)為串行的語義,后半句是指指令重排序現(xiàn)象和工作內(nèi)存和主內(nèi)存同步延遲現(xiàn)象。關(guān)于內(nèi)存模型的講解請(qǐng)參考死磕同步系列之。目前國(guó)內(nèi)市面上的關(guān)于內(nèi)存屏障的講解基本不會(huì)超過這三篇文章,包括相關(guān)書籍中的介紹。

問題

(1)volatile是如何保證可見性的?

(2)volatile是如何禁止重排序的?

(3)volatile的實(shí)現(xiàn)原理?

(4)volatile的缺陷?

簡(jiǎn)介

volatile可以說是Java虛擬機(jī)提供的最輕量級(jí)的同步機(jī)制了,但是它并不容易被正確地理解,以至于很多人不習(xí)慣使用它,遇到多線程問題一律使用synchronized或其它鎖來解決。

了解volatile的語義對(duì)理解多線程的特性具有很重要的意義,所以彤哥專門寫了一篇文章來解釋volatile的語義到底是什么。

語義一:可見性

前面介紹Java內(nèi)存模型的時(shí)候,我們說過可見性是指當(dāng)一個(gè)線程修改了共享變量的值,其它線程能立即感知到這種變化。

關(guān)于Java內(nèi)存模型的講解請(qǐng)參考【死磕 java同步系列之JMM(Java Memory Model)】。

而普通變量無法做到立即感知這一點(diǎn),變量的值在線程之間的傳遞均需要通過主內(nèi)存來完成,比如,線程A修改了一個(gè)普通變量的值,然后向主內(nèi)存回寫,另外一條線程B只有在線程A的回寫完成之后再?gòu)闹鲀?nèi)存中讀取變量的值,才能夠讀取到新變量的值,也就是新變量才能對(duì)線程B可見。

在這期間可能會(huì)出現(xiàn)不一致的情況,比如:

(1)線程A并不是修改完成后立即回寫;

閱讀需要支付1元查看
<