Разбираем правила видимости и упорядочивания операций в Java Memory Model: что означает отношение
happens-before, как и когда помогают
volatile,
synchronized, финальные поля (
final), и почему без них возникают «несвежие» данные. Покажем безопасную публикацию объектов, корректный
double-checked locking, низкоуровневый доступ через
VarHandle, влияние ложного разделения и аннотацию
@Contended, а также практические замечания про
Thread.start()/
Thread.join(),
Future.get() и микробенчмарки
JMH.