Java的long和double類型的賦值操作爲什麼不是原子性的?

在這裏插入圖片描述

  1. 對一個沒有用volatile修飾的long或double類型的寫操作會被拆分成兩次寫,每次寫該類型的32-bit數據,這就導致了在多線程的場景下,可能一個線程看到了對這個64-bit數據類型寫入的前32-bit數據,和被另一個線程的後32-bit的數據
  2. 使用volatile修飾後的long和double類型的讀寫操作是原子性的
  3. 對其引用類型(Long/Double)的讀寫操作總是原子的,儘管他們的實現可能被分爲兩次32-bit或者一個64-bit
  4. 不同JVM的實現對這個問題的處理方案不同,可能會將long/double分爲兩次32-bit寫入,也可能直接寫入64-bit,但是建議JVM的實現要避免將數據拆爲兩次寫入,而編碼者應該顯示的使用volatile或者其他同步機制來避免因此可能出現的問題