Хорошо, давайте получим Спецификацию языка Java.Раздел 17.4.5 определяет случай до события следующим образом:
Два действия могут быть упорядочены с помощью отношения случай до.Если одно действие происходит раньше другого, то первое видно и упорядочено до второго.Если у нас есть два действия x и y, мы пишем hb (x, y), чтобы указать, что x происходит до y.
- Если x и y являются действиями одного потока, а x предшествует yв программном порядке, то hb (x, y).
- Для этого объекта существует крайний случай "до" от конца конструктора объекта до начала финализатора (§12.6).
- Если действие x синхронизируется со следующим действием y, то у нас также есть hb (x, y).
- Если hb (x, y) и hb (y, z), то hb (x, z).
Следует отметить, что наличие предшествующего событиясвязь между двумя действиями не обязательно подразумевает, что они должны происходить в таком порядке в реализации.Если переупорядочение дает результаты, согласующиеся с законным исполнением, оно не является незаконным.
Затем идет два обсуждения:
Более конкретно, если два действия совместно используют a, происходит- перед отношениями не обязательно должно происходить то, что произошло в таком порядке, с любым кодом, с которым они не делятся отношениями до появления.Запись в одном потоке, находящемся в гонке данных, с чтениями в другом потоке, например, может показаться нарушением этих чтений.
В вашем случае поток проверяет
if (!initialized)
может увидеть новое значение для initialized
, прежде чем увидит все записи, добавленные к someList
, и, следовательно, работать с частично заполненным списком.
Обратите внимание, что ваш аргумент
Также обратите внимание, что someList
был объявлен как final
и содержит ссылку на параллельный список, чей writes
происходит до reads
не имеет отношения к делу.Да, если поток читает значение из списка, мы могли бы заключить, что он также видит все, что происходит - до того, как записывается это значение.Но что, если он не читает значение?Что если список окажется пустым?И даже если он читает значение, это не означает, что были выполнены последующие записи, и, следовательно, список может показаться неполным.