2013-06-21 174 views

回答

-2

原子通常用於並行編程。

在工作竊取模式下,它只支持異步,完成,forasync,隔離和原子變量。

您可以查看原子作爲安全保護,避免數據競爭和其他您需要在並行編程中關注的問題。

+0

這並沒有回答具體關於'AtomicLongFieldUpdate'的問題。 – Gray

5

你可以把成本階梯以下:

  • 普通long:價格便宜,但不安全的多線程訪問
  • volatile long:越貴,安全的多線程訪問,原子操作不可能
  • AtomicLong:最便宜的,安全的多線程訪問,原子操作可能

(WHE ñ我說'不安全'或'不可能'我的意思是'沒有像同步這樣的外部機制'當然。)

在需要多線程訪問的情況下,但大多數操作都是簡單的讀取或寫入,只需要幾個原子操作,就可以創建一個AtomicLongFieldUpdate的靜態實例,並在需要更新原子時使用它。然後,存儲器/運行時間開銷類似於簡單的volatile變量,除了原子操作的順序(或者比普通的AtomicLong操作稍微貴一些)。

這是nice little tutorial

+0

只需添加一些更多信息。 'AtomicLong'只比'volatile long'更「昂貴」,因爲有一個包裝類 - 所以內存開銷稍微增加了一點。另外,如果你正在執行'++','volatile long'對於多線程訪問不是'安全的'。 – Gray

+0

另外AtomicLongFieldUpdate的內存開銷遠不止是一個簡單的AtomicLong。運行時將比'volatile long'和'AtomicLong'慢,因爲它使用了反射。 – Gray

+1

@Gray你可以使用1個靜態ALFU實例,所以內存開銷並不像你想象的那麼大。認爲(不確定)反射只用於設置字段,而不是每次訪問;而且在最近的HotSpot版本中,操作是[內在的](http://bugs.sun.com/bugdatabase/view_bug.do?bug_id = 7023898)。準確的成本模型(內存和運行時)將取決於JRE和JVM的實現。 – rxg

2

是否有人知道AtomicLongFieldUpdate類的任何實際使用情況?

我從來沒有用過這個類自己,但在我的工作區做一個GET使用我看到它使用一對夫婦的「現實生活」的實例:

  • com.google.common.util.concurrent.AtomicDouble用它來修改原子的內部volatile long字段,使用Number.doubleToRawLongBits(...)存儲來自double的位。很酷。

  • net.sf.ehcache.Element使用它來自動更新hitCount字段。

我已閱讀說明,但我還沒有完全掌握它的意義。

它基本上提供了與AtomicLong相同的功能,但在另一個類的本地字段上。AtomicLongFieldUpdate的內存負載小於AtomicLong,因爲您爲每個字段配置了一個更新實例,這樣可以降低內存開銷,但是反射會佔用更多的CPU開銷(儘管可能很小)。

的Javadoc說:

這個類設計用於在其中相同的節點的幾個字段是獨立受原子更新原子的數據結構的使用。

當然,但我只是使用多個Atomic*領域。正是我使用這個類的唯一原因是,如果有一個我無法改變的現有類,我想以原子方式增量。

0

你之所以會使用例如AtomicLongFieldUpdater贊成AtomicLong只是爲了減少堆成本。內部兩者在compareAndSet級別上的工作幾乎相同,都在最後使用sun.misc.Unsafe。

考慮你有一個初始化1000k次的某個類。有了AtomicLong,你可以創建1000k AtomicLongs。另一方面,使用AtomicLongFieldUpdater時,您將創建1個CONSTANT AtomicLongFieldUpdater和1000k長的基元,這當然不需要太多的堆空間。