030 Synchronized Etc

강의 메모 - synchronized 특성 #

재진입성 #

  • 모니터 내에서 이미 synchronized 영역에 들어간 스레드가 다시 같은 모니터 영역으로 들어갈 수 있는데, 이를 “모니터 재진입"이라고 한다
  • 재진입 가능하다는 것은 락의 획득이 호출 단위가 아닌 스레드 단위로 일어난다는 것을 의미하며 이미 락을 획득한 스레드는 같은 락을 얻기 위해 대기할 필요 없이 synchronized 블록을 만났을 때 같은 락을 확보하고 진입한다
    • 같은 모니터라면 대기/경쟁 없이 바로 진입 가능 (스레드 단위)

img.png

  • 상속하게 되면 자식은 부모의 락과 동일한 락을 가지게 된다
      1. 자식 클래스에서 method() 실행됨
      1. 부모클래스의 method() 실행
      1. 서로 모니터가 동일하므로 재진입이 가능한것
  • 동기화 된 메서드에서 다른 동기화 된 메서드를 호출하는 경우 이미 락(lock)을 가지고 있는 스레드가 같은 락을 확보하고 재진입 시 데드락이 발생하지 않고 정상적으로 진행할 수 있게 된다

가시성 #

  • synchronized 는 가시성을 지원한다
  • 가시성이란 한 스레드가 공유자원을 수정하거나 쓰기 작업을 했을 때 다른 스레드가 수정한 내용이 보이는 것을 말한다
    • CPU 특성상 cache memory를 가진다.
    • cache memory에 저장된 데이터를 가지고 연산작업 하는게 더 빠르다. 항상 main memory에서 가져오는게 아니라 cache memory에서 가져와서 연산작업을 할 수 있기 때문에 main memory에 반드시 저장하지 않는 경우도 있다. 이때 동일한 변수 A가 cache memory != main memory(실시간 업데이트 안해줘서)일 수 있다. 그래서 데이터 불일치가 발생할 수 있다. -> 가시성이 확보되지 않아서 발생하는 문제라고 본다.
  • 가시성은 volatile 강의 챕터에서 자세히 다룹니다

그 외 특징 #

  • sleep() 을 실행한 스레드는 동기화 영역에서 대기 중이더라도 획득한 락을 놓거나 해제하지 않는다
    • 대기하더라도 해당 스레드가 lock을 획득한 상태여도 lock을 반납하거나 해제하지 않는다. 계속 가지고 있는다.
    • wait() : 이때는 lock을 반납한다. 다른 쓰레드가 lock을 획득해서 본인의 wait 상태를 깨워줄 수 있다.
  • synchronized 의 동기화 영역에 진입하지 못하고 대기 중인 스레드는 인터럽트 되지 않는다
  • synchronized 의 동기화 영역에 진입하지 못하고 대기 중인 스레드가 다시 경쟁해서 모니터를 획득하는 것은 순서가 정해져 있지 않다
    • = 비공정성
    • 모니터를 계속 획득하지 못하는 기아 상태의 스레드가 나올 수도 있지만 스케줄러가 적절하게 조절한다