반응형
java는 멀티 스레드(Multi-Thread) 프로그래밍이 가능한 언어이다. 동시에 여러 가지 일을 할 수 있도록 하는 멀티 스레드, 그리고 스레드는 자바의 중요한 특성인데 cpu의 사용률을 높이기 위해 사용한다. 멀티 스레드 구현을 효과적으로 하기 위해 Atomic과 CAS 같은 개념이 사용된다.
Atomic
- synchromized는 lock을 사용해 다른 스레드가 wating 하는 상황이 발생한다.
- 이걸 해결하기 위해 non-blocking한 방법으로 Atomic연산 사용
- Atomic연산의 핵심 원리가 바로 CAS(Compare and swap)이다
- atomin 자료형은 기본 자료형의 동기화를 보장해주는데 내부에서 CAS 알고리즘을 사용
- atomic 변수는 멀티 스레드 환경에서 원자성을 보장해주기 위해 나온 개념
- 원자성 : 연산 작업이 하나라도 실패하면 전부 실패해야 하고, 작업이 성공하면 모두 성공해야 하는 성질
Compare and swap
- CAS는 멀티 스레딩 환경에서 이전에 언급한 synchronized외의 동시성 처리를 위한 방법 중 하나이다
- 동기화를 위해 비교한 후 바꿔주는 것
- 멀티 스레드에서 변수 값을 참조할 때, 메인 메모리에서 참조하지 않고 각 cpu 캐시 영역에서 메모리값을 참조한다. 이때 스레드에 저장된 값과 메모리에 저장된 값을 비교해 값이 일치하는 경우 새로운 값으로 바꿔주고, 일치하지 않으면 실패 후 재시도한다.
- 여기서 CAS는 lock을 걸지 않고 변수마다 동기화를 사용한다.
ABA Problem
- CAS에서 공유 객체에 대한 변화를 감지하지 못했을 경우 문제가 발생하게 된다.
- 이런 경우를 ABA Problem이라 한다.
- 이걸 해결하기 위해 DCAS(double check CAS)를 사용한다.
- 사용 방법은 CAS(값) && CAS(값) 으로 이중 체크하는것
반응형
'Develop > Java' 카테고리의 다른 글
[Java] this. 의미 (0) | 2023.06.03 |
---|---|
[Java] Concurrent HashMap과 Concurrent List (0) | 2023.05.29 |
[Java] Synchronized 동기화 예제 (0) | 2023.05.14 |
[Java] Synchronized VS Reentrant 차이 (0) | 2023.05.14 |
[Java] Thread란? (0) | 2023.05.14 |