众所周知,即使是易失性的数组,在读取或写入元素时也不提供易失性语义,并发访问数组的第k个元素需要显式的易失性读取。此易失性读取通过Unsafe.getObjectVolatile()
执行。
我想知道,只声明一个对象,而不是没有volatile的数组,使用Unsafe.getObjectVolatile()
来读取它可以获得与使用volatile声明它相同的效果吗?
答案 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前向移植工作到达。和/或考虑实施回退代码路径。