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