2012-04-02 123 views
6

我有點糊塗了......什麼操作都是原子操作

這是真的,閱讀從多個線程\寫所有除長和雙是一個基本操作和它需要使用揮發性只長一倍?

+1

你有一個源爲了這? – paislee 2012-04-02 20:51:05

回答

8

這聽起來像你指的是JLS的this section。這是保證所有基本類型 - 除了doublelong - 所有的線程將看到實際寫入該變量一些值。 (隨着doublelong,前四個字節可能已經寫一個線程,並通過另一個線程的最後四個字節,如在JLS,該節規定),但他們不一定會看到在相同值除非該變量被標記爲volatile

即使使用volatilex += 3不是原子,因爲它是x = x + 3,這確實讀取和寫入,並有可能寫入讀取和寫入之間x。這就是爲什麼我們有AtomicIntegerjava.util.concurrent中的其他實用程序。

0

這聽起來不對。

原子操作是一個強迫所有線程等待訪問資源直到另一個線程用它做。我不明白爲什麼其他數據類型是原子的,而其他的不是。

3

讓我們不要混淆原子與線程安全的。由於每個是兩個獨立的32位存儲,所以長寫和雙寫不是原子的。假設它們不是複合寫入(例如,i++),存儲和加載非長/雙字段是完全原子的。

原子我的意思是,你不會讀一些亂碼對象儘可能多線程編寫不同對象與同場的結果。

Java Concurrency In Practice 3.1.2

外的薄AIRE安全:當一個線程讀取的變量,而不 同步,它可能會看到一個過時的值,但是至少它看到 值實際上是通過一些線程放置在那裏的,而不是隨機的一些值 。對於所有變量都是如此,除了64位long和 double,它們不是易失性的。允許JVM將64位 讀取或寫入爲兩個不是原子的獨立32位操作。

0

揮發性具有其他語義不僅僅是編寫價值原子

這意味着其他線程能夠立即看到更新後的值(和它不能被優化掉)