Java Atomic, Synchronized, volatile

Android Chen·2021년 11월 11일
0
post-custom-banner

위 세가지 방법은 모두 자바에서 동기화문제를 해결하는 방법이다.

Atomic, Synchronized

  • Atomic은 Type으로 멀티쓰레드환경에서 동기화를 보장하고 Synchronized 또한 Lock으로 동기화를 보장한다.

둘의 차이점

[1] Synchronized : Synchronized 키워드를 사용하면 쓰레드는 해당 블록 전체를 lock하기 때문에 다른 쓰레드는 아무런 작업을 하지 못하고 기다리는 상황이 발생한다.

[2] Atmoic : Atomic의 경우 NonBlocking 상태로 동기화 문제 해결이 가능하다.

  • Atomic은 Compared and Swap 방법을 사용한다. 멀티쓰레드, 멀티코어 환경에서는 각 CPU는 메인 메모리에서 변수값을 참조하지 않고 각 CPU의 캐시 영역에서 메모리를 참조한다.

  • 쓰레드에 저장된 값과 메인 메모리에 저장된 값을 비교하여 일치하는 경우 새로운 값으로 교체하고 / 일치하지 않는다면 접근을 제한하고 재시도한다.

[3] volatile ==> 이 키워드로 선언된 객체는 CPU캐시가 아닌 메모리에서 값을 참조한다.

  • 또한 오직 1개쓰레드에서만 쓰기작업이 가능하고 다른 쓰레드는 읽기작업만 할 때 안정성이 보장된다. 하지만 AtomicInteger는 여러 쓰레드에서 읽기/쓰기작업을 병행할 수 있다.
profile
https://github.com/Userz1-redd
post-custom-banner

0개의 댓글