여러 스레드에 공유되는 자원은 동시성 이슈가 발생할 수 있습니다.
공유되는 객체에 대한 접근을 관리해야 동시성 이슈를 막을 수 있습니다.
Lock - Synchronized를 활용한 동시 접근 제어
- synchronized 키워드를 사용해 하나의 스레드만 접근할 수 있도록 제한
public class SafeCounterWithLock {
private int counter;
public synchronized void increment() {
counter++;
}
}
문제점 : synchronized 키워드는 성능 저하를 발생 시킬 수 있음
- 다른 스레드는 block, suspend 상태에 놓이게 된다. → 스레드를 중지시키고 다시 실행시키는 것은 비용이 매우 크다.
Atomic - CAS(Compare-and-swap) 을 활용한 동시 접근 제어
- Atomic - 멀티 스레드 환경에서 원자성을 보장하기 위해 나온 개념
- Synchronized 와는 다르게 쓰레드를 block 시키지 않고 동시성 제어를 할 수 있는 방식(non-blocking)
- 핵심 원리는 CAS(Compare-and-swap) 알고리즘
CAS(Compare And Swap) 알고리즘
- 변수의 값을 변경하기 전에 기존에 가지고 있던 값이 내가 예상하던 값과 같을 경우에만 새로운 값으로 할당하는 방법
- 데이터 무결성을 위해 기계어 수준의 single operation에서 동작
- 메모리에서 값을 읽어온다
- 예상값과 비교
- 메모리 = 예상값 일 경우, 메모리 값 업데이트
- 자바로 나타낸 예시 - 실제로는 low level
- 여러 스레드가 하나의 값을 업데이트 하는 경우 → 하나의 스레드만 값을 업데이트 한다.
- Lock과 다르게 다른 스레드들은 중지되지 않고, 값을 업데이트 하지 못한다는 정보를 받게 된다.