关于Unsafe.getObjectVolatile用法

时间:2015-07-21 09:03:59

标签: java concurrency volatile

众所周知,即使是易失性的数组,在读取或写入元素时也不提供易失性语义,并发访问数组的第k个元素需要显式的易失性读取。此易失性读取通过Unsafe.getObjectVolatile()执行。

我想知道,只声明一个对象,而不是没有volatile的数组,使用Unsafe.getObjectVolatile()来读取它可以获得与使用volatile声明它相同的效果吗?

1 个答案:

答案 0 :(得分:1)

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

的实施情况

它在内部使用private final Object[] array字段,并通过不安全的方式对其进行隔离访问,例如这是元素设定者:

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

请注意,内部和不受支持的 Unsafe API可能会在Java 9中消失/无法访问,因此如果您想使用它,请准备一次varhandles前向移植工作到达。和/或考虑实施回退代码路径。