【发布时间】:2018-06-05 20:20:36
【问题描述】:
如果我们在 set 方法中省略 setArray 会发生什么?
您能否编写代码,即使使用一些辅助信号量,以显示使用这种易失性写入和调用 setArray 的必要性?
以下代码来自 CopyOnWriteArrayList.java
final transient Object lock = new Object();
private transient volatile Object[] array;
public CopyOnWriteArrayList() { setArray(new Object[0]); }
public E set(int index, E element) {
synchronized (lock) {
Object[] elements = getArray();
E oldValue = elementAt(elements, index);
if (oldValue != element) {
int len = elements.length;
Object[] newElements = Arrays.copyOf(elements, len);
newElements[index] = element;
setArray(newElements);
} else {
// Not quite a no-op; ensures volatile write semantics
setArray(elements); // <------ what is it actually for ? ------
// what If it would me ommited ?
}
return oldValue;
}
}
final void setArray(Object[] a) {
array = a;
}
【问题讨论】:
-
Gosling 以cryptic comments 闻名。我建议你仔细阅读JLS-8.3.1.4.
volatileFields
标签: java concurrency volatile