gpt4 book ai didi

java - "volatile write semantics"是什么意思?

转载 作者:塔克拉玛干 更新时间:2023-11-02 20:22:59 26 4
gpt4 key购买 nike

如果我们在 set 方法中省略 setArray 会发生什么?

您能否编写代码,甚至使用一些辅助信号量,来表明使用这种 volatile 写入和调用 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;
}

最佳答案

此处的“ volatile 写入”语义意味着将安全地发布一个新数组。你可能注意到了,有一种方法

final Object[] getArray() {
return array;
}

这意味着您可以只读取已发布的数组而无需任何同步(这是 CopyOnWriteArrayList 的全部要点)。如果java中存在并发读写对象的可能,则必须使用volatile关键字。否则,对象可能会发布不一致。如果以这种方式发布对象,则其某些字段可能无法正确初始化。

关于主题的信息过多,我建议你阅读this great article

关于java - "volatile write semantics"是什么意思?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50708334/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com