JLS говорит, что вы должны делать, чтобы получить гарантированное согласованное выполнение в приложении, включающем «межпоточные действия». Если вы этого не сделаете, выполнение может быть несовместимым. Но будет ли он на самом деле противоречивым, зависит от используемой вами JVM, используемого вами оборудования, приложения, входных данных и ... всего, что может происходить на компьютере при запуске приложения.
Я не вижу, что скажет вам предложенный вами тест. Если тест показывает несогласованные исполнения, он подтвердит правильность правильной синхронизации. Но если выполнение теста несколько раз показывает только (по-видимому) согласованные исполнения, это не говорит о том, что исполнения всегда будут согласованными.
Пример:
Предположим, что вы запускаете свои тесты на (скажем) JDK 1.4.2 (rev 12) / Linux / 32bit с «клиентской» JVM и опциями x, y, z, работающими на однопроцессорной машине. И что после выполнения теста 1000 раз вы заметите, что , кажется, не имеет никакого значения , если вы пропустите volatile
. Что вы на самом деле узнали в этом сценарии?
- Вы НЕ узнали, что это действительно не имеет значения? Если вы измените тест, чтобы использовать больше потоков и т. Д., Вы можете получить другой ответ. Если вы выполните тест еще несколько тысяч, миллионов или миллиардов раз, вы можете получить другой ответ.
- Вы ничего не узнали о том, что может произойти на других платформах; например другая версия Java, другое оборудование или другие условия загрузки системы.
- Вы НЕ узнали, является ли безопасным опускание ключевого слова
volatile
.
Вы узнаете что-то, только если тест показывает разницу. И единственное, что вы узнаете, это то, что синхронизация важна ... это то, о чем все учебники и т. Д. Говорили вам все это время: -)
Итог: это худший вид тестирования черного ящика. Это не дает вам реального понимания того, что происходит внутри коробки. Чтобы получить такое представление, вам необходимо: 1) понять модель памяти и 2) глубоко проанализировать собственный код, генерируемый JIT-компилятором (на нескольких платформах ...)