- 모니터 락 및 커널의 접근
- 기본적으로 동일 인스턴스/객체에 대한 다른 스레드에서 접근시 락이 걸리기 때문
- 공유자원: 여러 스레드가 동시에 접근할 수 있는 자원
- 임계영역: 공유자원들 중 여러 스레드가 접근했을때 문제가 생길 수 있는 부분
- 경쟁상태: 둘 이상의 스레드가 공유자원을 병행적으로 읽거나 쓰는 동작을 할 때 접근 순서에 따라 실행결과가 달라지는 현상
경쟁상태가 주로 발생하는 패턴은 아래와 같다
- Read-Modify-Write 패턴: 대표적으로 증감 연산자가 있다
- Check-then-act
이를 해결하기 위해서는 원자성과 가시성을 보장해야 함
- 원자성: 공유 자원에 대한 작업의 단위가 더 이상 쪼갤 수 없는 하나의 연산처럼 동작하는 것
- 가시성: 한 스레드가 공유자원의 값을 변경시 다른 스레드에게 언제 어떻게 보이는가를 뜻하는 것
- 자바에서는
volatile키워드를 제공함, 해당 변수는 메인메모리에서만 읽고 쓰기를 수행함 (CPU 캐시를 사용하지 않음)
- 자바에서는
블로킹
특정 스레드가 작업을 수행하는동안 다른 작업은 진행하지 않고 대기하는 방식
논블로킹
다른 스레드의 작업여부와 상관없이 자신의 작업을 수행하는 방식
- 자바에서는 Atomic 타입이 있음
- CAS: CAS(Compare-And-Swap)은 메모리의 현재 값이 예상 값과 같을 떄만 새로운 값으로 교체하는 원자적 연산이다.