今天看《Java併發編程實戰》的書中,關於long和double的原子性有這麼一段話,意思就是在JVM中,對於32位(或者如下)的數值變量都是原子性讀寫,可是對於long和double這種64位的操做是非原子性。分紅兩次32位的操做。編程
在如下這種操做中就會出現讀取的數值錯誤。併發
線程A先寫高位32位操做,優化
線程B讀高位32位,操作系統
線程B讀地位32位,線程
線程A寫地位32位。排序
那麼解決辦法就是對變量加上volatile關鍵字,volatile關鍵字有3個主要功能,第一個就是可見性,每次直接從內存讀寫。第二個就是禁止指令重排序,在JVM中會對指令進行優化,優化的時候可能會對指令進行排序。第三個就是對volatile修飾的變量讀取都是原子性的。內存
可是書上沒有說操做系統的位數和JVM的位數。變量
因此我猜測,只有64位JVM+64位操做系統+64位硬件才能實現對64位long和double的原子性讀取。硬件