Глядя строго на то, что делает код, и не более того, и оценивая его только с точки зрения модели памяти, вы правы. Запись в энергонезависимую переменную publisher
в потоке 1 и чтение из энергонезависимых переменных в потоке-учредить происходит, прежде, чем отношения, так что все предыдущие записи из потока 1 будут видны последующее чтением из нити 2.
Как отметил CupawnTae, нет необходимости, чтобы список и массив были неустойчивыми, чтобы это могло удерживаться. Только publisher
должен быть неустойчивым.
Рассматривая это с более широкой точки зрения, очень сложно расширить этот код, чтобы сделать что-либо еще.(Отмените тот факт, что List
, возвращенный Arrays.asList
, не может иметь элементов, добавленных к нему, предположим, что это вместо ArrayList
.) Предположительно, поток 1 или какой-либо другой поток захочет продолжить добавлять элементы в список. Если это произойдет, чтобы привести ArrayList
к перераспределению его базового массива, это может произойти, когда поток 2 все еще читает результаты предыдущего добавления. Таким образом, противоречивое состояние может быть видимым для потока 2.
Предположим, что поток 1 хочет сделать последующие обновления. Он должен будет установить publisher
на какое-то другое значение, скажем 2. Теперь, как читать потоки знают, для чего нужно проверить правильное значение? Ну, они могут читать ожидаемое значение от некоторой другой изменчивой переменной ....
Несомненно, можно построить схему, в которой поток 1 может писать в список (или массив) по желанию, а поток 2 никогда ничего не увидит но непротиворечивые снимки, но вы должны быть исключительно осторожны в отношении видимости памяти на каждом шагу. В определенный момент проще использовать блокировки.
Обратите внимание, что 'volatile' ключевое слово применяется к списку или массива переменной себя, не содержимое списка или массива. –
Непонятно, что вы здесь просите. Для примитивов «volatile» относится к самому первобытному значению. Для объектов ключевое слово 'volatile 'относится только к ссылке, а не к объекту. Поэтому для 'list' и' array' '' volatile' не влияет на содержимое списка или массива. 'volatile' не делает то, что вы, кажется, думаете. –
@JimGarrison в Java 1.5 и новее, volatile гарантирует видимость всех изменений, внесенных до назначения, волатильные, а не только изменения самого взрывателя. Так что это может быть актуально. – Arkadiy