• 모니터 락 및 커널의 접근
  • 기본적으로 동일 인스턴스/객체에 대한 다른 스레드에서 접근시 락이 걸리기 때문
  • 공유자원: 여러 스레드가 동시에 접근할 수 있는 자원
  • 임계영역: 공유자원들 중 여러 스레드가 접근했을때 문제가 생길 수 있는 부분
  • 경쟁상태: 둘 이상의 스레드가 공유자원을 병행적으로 읽거나 쓰는 동작을 할 때 접근 순서에 따라 실행결과가 달라지는 현상

경쟁상태가 주로 발생하는 패턴은 아래와 같다

  • Read-Modify-Write 패턴: 대표적으로 증감 연산자가 있다
  • Check-then-act

이를 해결하기 위해서는 원자성과 가시성을 보장해야 함

  • 원자성: 공유 자원에 대한 작업의 단위가 더 이상 쪼갤 수 없는 하나의 연산처럼 동작하는 것
  • 가시성: 한 스레드가 공유자원의 값을 변경시 다른 스레드에게 언제 어떻게 보이는가를 뜻하는 것
    • 자바에서는 volatile 키워드를 제공함, 해당 변수는 메인메모리에서만 읽고 쓰기를 수행함 (CPU 캐시를 사용하지 않음)

블로킹

특정 스레드가 작업을 수행하는동안 다른 작업은 진행하지 않고 대기하는 방식

논블로킹

다른 스레드의 작업여부와 상관없이 자신의 작업을 수행하는 방식

  • 자바에서는 Atomic 타입이 있음
  • CAS: CAS(Compare-And-Swap)은 메모리의 현재 값이 예상 값과 같을 떄만 새로운 값으로 교체하는 원자적 연산이다.