Java 什么是;volatile write semantics";什么意思?

Java 什么是;volatile write semantics";什么意思?,java,concurrency,volatile,Java,Concurrency,Volatile,如果我们在set方法中省略setArray,会发生什么 您是否可以编写代码,甚至使用一些助手信号量,以显示使用这种易失性的setArray写入和调用的必要性 下面的代码来自CopyOnWriteArrayList.java final transient Object lock = new Object(); private transient volatile Object[] array; public CopyOnWriteArrayList() { setArray(new Ob

如果我们在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;
}
final transient Object lock=new Object();
私有瞬态易失性对象[]数组;
公共CopyOnWriteArrayList(){setArray(新对象[0]);}
公共E集(整数索引,E元素){
已同步(锁定){
Object[]elements=getArray();
E oldValue=元素AT(元素,索引);
if(oldValue!=元素){
int len=elements.length;
Object[]newElements=Arrays.copyOf(elements,len);
新元素[索引]=元素;
集合数组(新元素);
}否则{
//不完全是no-op;确保了不稳定的写语义
setArray(elements);//这里的“Volatile write”语义意味着新数组将安全发布。您可能注意到,有一个方法

final Object[] getArray() {
    return array;
}
这意味着您可以在不进行任何同步的情况下读取刚刚发布的数组(这就是CopyOnWriteArrayList的要点)。如果java中存在对象并发读写的可能性,则必须使用
volatile
关键字。否则,对象可能会不一致地发布。如果以这种方式发布对象,则其某些字段可能未正确初始化

关于这个话题的信息太多了,我建议你们读一读小鹅叫什么名字。我建议你们仔细阅读