Как и в приведенном ниже коде, возможно, что в одном случае поток записи проверяет значение x как ноль, при этом переключение контекста не происходит, и поток чтения также видит значение x как 0.
Да, это абсолютно возможно.Несмотря на то, что x
является энергозависимым, x++
включает в себя две совершенно разные операции: энергозависимое чтение, затем энергозависимая запись.Каждая из этих операций является атомарной, но между ними абсолютно возможно переключение контекста.(Также возможно, чтобы два потока работали на совершенно разных процессорных ядрах, так что даже без переключения контекста возможно, что читатель может прочитать исходное значение, в то время как автор только собирается записать новое значение.)
Мне было просто интересно, будет ли энергозависимость достаточной в этом случае или нам нужно идти с синхронизированным, чтобы избежать условия гонки
synchronized
победздесь не очень помогает.Вы, похоже, беспокоитесь о том, чтобы предотвратить этот сценарий (что volatile
позволяет, но synchronized
может предотвратить):
- поток записи читает исходное значение
x
- поток чтения читаетисходное значение
x
, печатает его - поток записи пишет новое значение
x
, которое никогда не читается
, но оно точно эквивалентно этому сценарию (который оба * 1032)* и synchronized
allow):
- поток чтения читает исходное значение
x
, печатает его - поток записи читает исходное значение
x
- поток записи пишет новое значение
x
, которое никогда не читается
, поэтому нет смысла «исправлять» одно без исправления другого.
Если вы хотите убедиться, чтоПоток читателя не читает x
до тех пор, пока поток записи не будет записан в него, вам нужно будет сделать что-то более сложное, например, используя wait
и notify
.