Что означает «семантика изменчивой записи»? - PullRequest
0 голосов
/ 05 июня 2018

Что могло бы произойти, если бы мы не указали setArray в методе set?

Не могли бы вы написать код, даже используя какой-нибудь вспомогательный семафор, который продемонстрировал бы необходимость использования этой изменчивой записи и вызова 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;
}

1 Ответ

0 голосов
/ 06 июня 2018

Семантика "Volatile write" здесь означает, что новый массив будет опубликован безопасно.Вы можете заметить, что существует метод

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

, который означает, что вы можете читать только что опубликованный массив без какой-либо синхронизации (в этом весь смысл CopyOnWriteArrayList).Если есть возможность одновременного чтения и записи объекта в Java, у вас есть для использования ключевого слова volatile.В противном случае объект может быть опубликован непоследовательно.Если объект опубликован таким образом, некоторые его поля могут быть неправильно инициализированы.

Для чрезмерного количества информации по теме, я предлагаю вам прочитать эту замечательную статью

...