java - 동기화 블록과 Lock_

잠자는 고양이·2025년 5월 21일

Java

목록 보기
61/73

동기화란?

멀티스레드 환경에서 여러 스레드가 공유 자원(변수, 객체, 파일 등)에 동시에 접근할 때, 데이터의 일관성을 유지하고 Race Condition을 방지하는 기술


동기화가 필요한 이유

  • 멀티 스레드 환경에서는 여러 스레드가 동시에 같은 자원에 접근할 수 있음
  • 동기화가 되지 않으면, 여러 스레드가 동시에 데이터를 수정하면서 오류 발생 가능성 증가
  • 이런 현상을 Race Condition이라고 함

synchronized 키워드

  • synchronized 키워드를 사용하여 동기화 가능
  • 두 가지 방식이 존재함:
    1. 메소드 동기화
    2. 블록 동기화

메소드 동기화

  • synchronized 키워드를 메소드 선언에 붙여 사용
  • 한 번에 하나의 스레드만 메소드 실행 가능
  • 단점: 메소드 전체가 잠기므로 불필요한 대기 시간이 발생할 수 있음

블록 동기화

  • 필요한 부분만 synchronized 블록으로 감싸서 동기화
  • 예: synchronized(this) 사용
  • 장점: 성능 최적화 가능

synchronized의 한계

  • 블로킹 방식: 하나의 스레드가 종료될 때까지 다른 스레드는 무조건 대기
  • 정교한 락 제어 불가능
  • 해결책: ReentrantLock 사용

ReentrantLock을 사용한 동기화

  • synchronized보다 정교한 락 제어 가능
  • 명시적으로 락 획득(lock) 및 해제(unlock) 필요
  • 다양한 동기화 기능 지원:
    • tryLock()
    • lockInterruptibly()

ReentrantLock vs synchronized 비교

항목synchronizedReentrantLock
락 제어 방식암묵적명시적 (lock() / unlock())
정교한 제어불가능가능 (tryLock(), lockInterruptibly())
공정성 설정불가능가능 (new ReentrantLock(true))
메소드 간 동기화 적용어려움가능
코드 복잡도낮음높음
성능간단한 경우 유리복잡한 경우 유리

profile
개발자가 되고 싶은 잠자는고양이

0개의 댓글