[1] Synchronized : Synchronized 키워드를 사용하면 쓰레드는 해당 블록 전체를 lock하기 때문에 다른 쓰레드는 아무런 작업을 하지 못하고 기다리는 상황이 발생한다.
[2] Atmoic : Atomic의 경우 NonBlocking 상태로 동기화 문제 해결이 가능하다.
Atomic은 Compared and Swap 방법을 사용한다. 멀티쓰레드, 멀티코어 환경에서는 각 CPU는 메인 메모리에서 변수값을 참조하지 않고 각 CPU의 캐시 영역에서 메모리를 참조한다.
쓰레드에 저장된 값과 메인 메모리에 저장된 값을 비교하여 일치하는 경우 새로운 값으로 교체하고 / 일치하지 않는다면 접근을 제한하고 재시도한다.
[3] volatile ==> 이 키워드로 선언된 객체는 CPU캐시가 아닌 메모리에서 값을 참조한다.