Java

[Java의 정석] 13-4. 스레드: 동기화

noahkim_ 2023. 11. 30. 13:25

남궁성 님의 "Java의 정석" 책을 정리한 포스팅 입니다.

 

9. 동기화

  • 한 스레드가 진행중인 작업을 다른 스레드가 간섭하지 못하게 막는 것입니다.
  • 멀티스레드의 경우 여러 스레드가 같은 프로세스 내의 자원을 공유해서 작업하므로 서로의 작업에 영향을 주게 됩니다.
  • 한 스레드가 특정 작업을 끝마치기 전까지 다른 스레드에 의해 방해받지 않도록 하는것이 필요합니다.

 

임계영역

  • 공유데이터를 사용하는 코드 영역입니다.

 

  • 단 하나의 스레드만 공유데이터를 사용하도록 하는 매커니즘입니다.
  • 해당 공유데이터를 사용하는 스레드는 락을 획득합니다.
  • 임계영역의 모든 코드를 수행하고 나서 락을 반납하며, 다른 스레드가 반납된 락을 획득하여 임계영역에 접근할 수 있습니다.

 

synchronized

  • synchronized 키워드를 붙여 임계영역을 설정합니다.
  • lock의 획득과 반납이 자동적으로 수행됩니다.
  • 해당 객체의 lock을 가지고 있는 스레드만 임계영역의 코드를 수행할 수 있습니다.

 

wait(), notify()

  • 한 스레드가 락을 오랫동안 보유하지 않도록 고안된 방법입니다.
  • 동기화 블록에서만 사용할 수 있습니다.

 

wait()
  • 임계영역의 코드를 수행하다가 더이상 진행할 상황이 아닐경우 호출합니다.
  • 스레드가 락을 반납하고 기다리게 합니다.

 

notify()
  • 작업을 진행할 수 있는 상황이 되면 호출합니다.
  • 스레드가 다시 작업을 수행할 수 있도록 합니다.
  • 대기중인 스레드만 해당됩니다.

 

Lock, Condition

volatile

fork & join