2014-04-28 80 views
4

重讀JMM,發現有一句話我不明白:重新排序在Java內存模型

在這裏,我們只考慮是可讀可寫爲 原子單元的變量 - 那是,沒有位域,未對齊訪問,或訪問 大於平臺上可用的字大小。

任何人都可以解釋上面顯示的單詞是粗體的情況。

+0

閱讀http://walivi.wordpress.com/2013/08/24/concurrency-in-java-a-beginners-introduction/中有關原子性,狀態可見性保證和文字撕裂的章節,並對其進行了精美的解釋。 – Nazgul

回答

2

在某些架構中,處理器可以在一個單一的命令的多個存儲器訪問做:

  • 位字段:設置存儲器的某些位;這通常是使用讀取 - 修改 - 寫入實現的,具有讀取和寫入的單獨訪問。
  • 未對齊訪問:在某些CPU體系結構中,處理器對訪問多字節值時可使用的地址施加限制,特別是跨越單詞邊界時。大多數現代處理器都沒有這個問題,因爲它們可以執行多次讀取來覆蓋所需的地址範圍;如果你從0x01讀到0x05,它將被分成0x01-0x04和0x05讀。如果你需要寫在那裏,這是複雜的;相同的區域將首先被讀取,然後被寫入,與對齊的地址(地址是4的倍數)相比,所需的存儲器操作是必要的3倍。 (請記住,在現代CPU上,問題更加複雜,因爲您有非常深的內存層次結構,每層對齊限制不同)。

在這些情況下,一個操作將需要跨越多個內存訪問,因此這可能會導致競爭條件,因此不會有原子性保證。