一道java面试题,求助
以下代码有什么可能的bug?如何修正?
volatile int[] arr = new int[...];
...
arr[4] = 100;
lalal
10 years, 9 months ago
Answers
嗯, 是个好问题.
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