一道java面试题,求助


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


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

java 面试题

lalal 10 years, 9 months ago

嗯, 是个好问题.


 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);
}

星熊YO仪 answered 10 years, 9 months ago

Your Answer