众所周知,数组即使在易失性的情况下,在读取或写入元素时也不提供易失性语义,并发访问数组的k元素需要显式的易失性读取。此易失性读取通过Unsafe.getObjectVolatile()执行。
我想知道,只声明一个对象,而不是没有易失性的数组,使用Unsafe.getObjectVolatile()来读取它可以获得与使用volatile声明它相同的效果吗?
发布于 2015-07-27 05:50:12
只需看一下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中消失/变得不可访问,因此,如果您想使用它,那么在变柄到达后准备进行一些移植工作。和/或考虑实现回退代码页。
https://stackoverflow.com/questions/31534706
复制相似问题