Java Memory Model에서의 가시성과 연산 순서 규칙을 살펴봅니다:
happens-before 관계가 무엇을 의미하는지,
volatile,
synchronized, 최종 필드(
final)가 언제 어떻게 도움이 되는지, 그리고 그것들이 없을 때 왜 “stale”(신선하지 않은) 데이터가 생기는지를 설명합니다. 객체의 안전한 퍼블리시, 올바른
double-checked locking,
VarHandle을 통한 저수준 접근, false sharing의 영향과
@Contended 애너테이션, 그리고
Thread.start()/
Thread.join(),
Future.get(), 마이크로벤치마크
JMH에 대한 실무 팁도 함께 다룹니다.