동기화 메서드

synchronized void testFunc()

  • critical section 기반 동기화 기법으로 메서드 코드 전체를 임계 영역으로 설정
  • 메서드를 여러 스레드에서 호출하더라도 동시 실행이 허용되지 않음
    • 특정 스레드가 동기화 메서드 호출하고 코드가 실행외는 동안 다른 스레드에서 동기화 메서드 호출할 경우 BLCOKED 상태로 전환

모니터 락 동작 순서

  1. (호출자) 스레드가 synchronized 메서드 혹은 코드 블록을 호출 시 모니터 락을 요청
  2. 타 스레드가 모니터 락을 이미 점유하고 있다면 모니터 락을 요청한 스레드는 Runnable 에서 Blocked 로 전환
  3. 기존 모니터 락 점유 스레드가 구간을 벗어나 모니터 락을 해제하면 Blocked 상태로 대기 중인 스레드 중 하나가 락을 얻고 동기화 구간에 진입(코드 구간에 대한 원자성 보장)

참고로 synchronized 쓰면 워킹 메모리와 메인 메모리 동기화도 포함되는 것.

  • volatile: 가시성만 보장
  • synchronized: 가시성 + 상호배제 둘 다 보장