데브허브 | DEVHUB | The Hidden Art of Thread-Safe Programming: Exploring java.util.concurrent by Dr. Heinz KabutzThe Hidden Art of Thread-Safe Programming: Exploring java.util.concurrent by Dr. Heinz Kabutz
java.util.Vector는 초기부터 스레드 안전성 문제(경쟁 조건, 교착 상태)를 겪으며 여러 Java 버전에서 수정되었으나, 여전히 미묘한 문제들을 내포하고 있음을 보여주는 사례입니다. 🚧
- 스레드 안전성은 매우 미묘하며, 테스트만으로는 동시성 버그를 완전히 찾아내기 어렵습니다. 🕵️♀️
- Java 메모리 모델은 동시성 프로그래밍의 규칙을 정의하지만, 이 규칙을 위반해도 즉시 문제가 드러나지 않아 버그 발견이 어렵습니다. 📜
LockSupport 클래스의 매우 희귀한 버그는 진단과 해결이 극도로 어려워, 특정 정적 초기화 블록을 통한 우회 코드가 JDK 내부에 존재합니다. 👻
- 직접 동시성 클래스를 작성하기보다는 JDK에 내장된
java.util.concurrent 라이브러리의 검증된 클래스를 사용하는 것이 가장 좋은 전략입니다. 📚
- JDK 내 동시성 클래스 중 사용 빈도가 낮은 클래스일수록 버그가 발견될 확률이 높으므로, 널리 사용되는 클래스를 선택하는 것이 안전합니다. 📉
Striped64 기반의 LongAdder는 AtomicLong과 달리 높은 동시성 환경에서 셀 배열을 사용하여 경쟁을 줄임으로써 압도적인 성능 향상을 제공합니다. 🚀
@Contended 어노테이션은 객체를 캐시 라인에 독립적으로 배치하여 false sharing을 방지하고 성능을 최적화하는 데 사용됩니다. 🧠
AtomicLong과 Striped64 모두 compare-and-swap (CAS) 연산을 기반으로 하여 락 없이 동시성을 처리합니다. 🔄