關於JVM中long和double的讀取原子性

今天看《Java併發編程實戰》的書中,關於long和double的原子性有這麼一段話,意思就是在JVM中,對於32位(或者如下)的數值變量都是原子性讀寫,可是對於long和double這種64位的操做是非原子性。分紅兩次32位的操做。編程

在如下這種操做中就會出現讀取的數值錯誤。併發

  1. 線程A先寫高位32位操做,優化

  2. 線程B讀高位32位,操作系統

  3. 線程B讀地位32位,線程

  4. 線程A寫地位32位。排序

那麼解決辦法就是對變量加上volatile關鍵字,volatile關鍵字有3個主要功能,第一個就是可見性,每次直接從內存讀寫。第二個就是禁止指令重排序,在JVM中會對指令進行優化,優化的時候可能會對指令進行排序。第三個就是對volatile修飾的變量讀取都是原子性的。內存


可是書上沒有說操做系統的位數和JVM的位數。變量

因此我猜測,只有64位JVM+64位操做系統+64位硬件才能實現對64位long和double的原子性讀取。硬件

相關文章
相關標籤/搜索