(Java) 자바 메모리 모델
* Java의 메모리 모델이란 Java의 쓰레드가 메모리에 액세스 할 떄 어떤 일이 일어나는지 규정하는 것이다. * 자바 메모리 모델과 친해지기 위한 지침 복수 쓰레드에서 공유하는 필드는 synchronized 또는 volatile로 보호하라 불변 필드는 final하라 생성자안에서 this를 놓치지 말라 1. reorder 2. visibility 3. 공유메모리와 액션 4. synchronized 5. volatile 6. final 7. Double-Checked Locking 패턴 1. reorder -> reoreder란 최적화를 위해 컴파일이나 Java 가상머신이 프로그램의 처리순서를 바꾸는 것을 말한다. reorder는 수행능려을 높이는데 널리 사용되지만 그 사실을 프로그래머가 의식하는 경우는 거의 없다. 실제 싱글 쓰레드 프로그램에서는 reorder가 이뤄지고 있는지 판단할 수 없다. 그러나 멀티쓰레드 프로그램에서는 reorder가 원인이 되어 이상 작동을 하는 경우가 있다. 자바의 컴파일러는 자바 코드를 바이트 코드로 컴파일 하면서 정해진 범위 내에서 자유롭게 최적화를 수행할 수 있다. 이런 최적화에는 단순히 코드의 특정 구문을 보다 효율적인 다른 구문으로 치환하는 경우도 있지만, 때론 중복된 구문을 삭제하거나 구문 간의 순서를 재배치함으로써 소기의 목적을 달성하기도 한다. 뿐만 아니라 CPU의 연산 시에도 인스트럭션을 재배열하거나 보다 작은 마이크로 인스트럭션으로 나눠서 처리할 수도 있기 때문에 자바로 작성된 프로그램의 정확한 수행 순서를 예측하기란 쉽지가 않다. 자바는 앞서 설명한 happens-before 관계를 보장함으로써 일반적인 단일 스레드 환경에서의 수행 순서를 보장하고 있지만, 멀티스레딩 환경에선 최적화에 따른 재배열(reordering)이 예상치 못한 가시성의 문제를 일으키지 않도록 보장하기 위해 명시적으로 동기화를 처리해 happens-bef...