【问题标题】:What does "volatile write semantics" mean?“易失性写语义”是什么意思?
【发布时间】: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;
}

【问题讨论】:

标签: java concurrency volatile


【解决方案1】:

这里的“Volatile write”语义意味着一个新数组将被安全地发布。你可能注意到了,有一个方法

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

这意味着您可以在没有任何同步的情况下读取刚刚发布的数组(这是 CopyOnWriteArrayList 的重点)。如果java中存在对象并发读写的可能性,你必须使用volatile关键字。否则,对象可能会不一致地发布。如果对象以这种方式发布,它的某些字段可能没有正确初始化。

主题信息过多,建议阅读this great article

【讨论】:

    猜你喜欢
    • 2012-09-16
    • 2018-04-11
    • 2010-11-20
    • 2017-03-18
    • 1970-01-01
    • 2010-09-15
    • 2012-12-12
    • 2013-11-02
    • 1970-01-01
    相关资源
    最近更新 更多