Я прочитал это в предыдущем комментарии к StackOverflow:
Но если вы хотите быть в безопасности, вы можете добавить простой синхронизированный (это) {} в конце вашего @PostConstruct [method]
[обратите внимание, что переменные НЕ были волатильными]
Я думал, что происходит - до принудительно, только если обе записи и чтения выполняются в блоке synchronized
или, по крайней мере, чтение является изменчивым.
Правильно ли цитируется предложение? Описан ли пустой блок synchronized(this) {}
всех переменных, измененных в текущем методе, на "общую видимую" память?
Пожалуйста, рассмотрите некоторые сценарии
-
что если второй поток никогда не вызывает блокировку на
this
? (предположим, что второй поток читается другими способами). Помните, что этот вопрос касается: сброса изменений в другие потоки, а не , чтобы другие потоки (синхронизировались) влияли на опрос изменений, сделанных исходным потоком. Также отсутствие синхронизации в других методах очень вероятно в контексте Spring@PostConstruct
, как говорится в оригинальном комментарии. -
- видимость памяти изменений, вызванных только во втором и последующих вызовах другим потоком? (помните, что этот синхронизированный блок является последним вызовом в нашем методе) - это означало бы такой способ синхронизации как очень плохую практику (устаревшие значения при первом вызове)