2015-07-21 31 views
2

衆所周知,數組即使在易失性時,在讀取或寫入元素時不提供易失性語義,併發訪問數組的第k個元素需要顯式易失性讀取。這種易失性讀取通過Unsafe.getObjectVolatile()執行。關於Unsafe.getObjectVolatile的用法

我想知道,只聲明一個對象,不是沒有volatile的數組,使用Unsafe.getObjectVolatile()來讀取它可以得到與使用volatile聲明它相同的效果?

+0

你的問題沒有編譯:)至少不在我的腦中。 –

+0

[是](http://permalink.gmane.org/gmane.comp.java.jsr.166-concurrency/12972)。如果您查看虛擬機中的源代碼,您會發現它們發出讀取障礙。 –

+0

只有當所有對該字段的寫入都使用'putObjectVolatile'時。但你爲什麼要這樣?爲什麼不簡單地聲明字段「volatile」? – Holger

回答

1

只是看看java.util.concurrent.atomic.AtomicReferenceArray

執行它內部使用private final Object[] array領域,並通過圍欄不安全,如訪問它這裏是元素二傳手:

public final void set(int i, E newValue) { 
    unsafe.putObjectVolatile(array, checkedByteOffset(i), newValue); 
} 

請注意,內部的和不支持不安全API可能會消失/變得無法用java 9,所以如果你想使用它的一些前瞻性移植工作準備一次varhandles到達。和/或考慮實施回退代碼路徑。