public final int get(int i) {
return getRaw(checkedByteOffset(i));
}
private int getRaw(long offset) {
return unsafe.getIntVolatile(array, offset);
}
public final void set(int i, int newValue) {
unsafe.putIntVolatile(array, checkedByteOffset(i), newValue);
}
嗯, 是个好问题.
这里arr变量本身是volatile的, 但是数组元素不是. 就是说
这里对arr[4]的赋值不保证 对其他线程的可见性.
解决方案是AtomicIntegerArray, 使用其 get, set方法. 看了下java源码, 毫无疑问的, 用了unsafe