volatile能保證long&double類型變量操作的原子性

這個命題是正確的,但是也不是必須的。

該命題的存在是Java內存模型要求lock, unlock, read, load, assign, use, write這個8個操作都具有原子性,但是同時又對64位的數據類型(long&double)給了一個相對寬鬆的規定,就是允許虛擬機將沒有被volatile參數修飾的64位數據類型的讀寫劃分爲兩次32位的操作來進行,即允許虛擬機將load, store, read, write這個4個操作實現爲非原子的。

既然如此爲何又是非必須的呢?JSR對於商用的JVM,強烈建議將這個四個操作實現爲原子操作,而且目前各平臺下的商用JVM幾乎都將其實現爲了原子操作。因此我們再編寫代碼的時候沒有必要把用到的long,double專門修飾爲volatile變量。

參考: 《深入理解Java虛擬機》

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章