一道java面试题,求助

以下代码有什么可能的bug?如何修正?

volatile int[] arr = new int[...];
...
arr[4] = 100;
阅读 4.4k
1 个回答

嗯, 是个好问题.

volatile int[] arr = new int[...]; 

这里arr变量本身是volatile的, 但是数组元素不是. 就是说

arr[4] = 100;

这里对arr[4]的赋值不保证 对其他线程的可见性.

解决方案是AtomicIntegerArray, 使用其 get, set方法. 看了下java源码, 毫无疑问的, 用了unsafe

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);
}
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题