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