ReentrantLock - Lock 획득을 위해 대기중인 Thread에 Interrupt 호출이 안먹힐 때

2024. 4. 30. 17:53·📘 Backend/Concurrency
목차
  1. ReentrantLock - lockInterruptibly()
  2. lockInterruptibly()를 사용해야 하는 이유 - 예시 코드
  3. lock.lock() 대신 lock.lockInterruptibly()를 사용

ReentrantLock - lockInterruptibly()

특정 Thread에서 Lock 획득을 위해lock.lock()을 호출했을 때 다른 스레드에 의해 이미 Lock이 점유되어 있는 상황에서

현재 Thread는 Lock이 해제되는걸 기다리기 위해 무한 대기 상태에 걸려 있습니다. (Blocking 상태)


이때 대기 상태를 해제하기 위해 Thread를 Interrupt를 시켰는데 Interrupt 호출이 되지 않아서, 알아보고 해결한 방법을 기록합니다.

아래 예시 코드로 설명해보겠습니다.


lockInterruptibly()를 사용해야 하는 이유 - 예시 코드

@Override
public void run() {
    lock.lock(); // Lock 획득 실패 - 다른 스레드에서 사용 중
    // ...
    if (Thread.currentThread().isInterrupted()) {
        cleanUpAndExit();
    }
}

위 예시 코드에서 Lock 획득 대기 상태를 풀기 위해 Thread.interrupt()를 호출해도

lock() 함수는 InterruptedException 상태를 무시하므로, Lock 획득을 위해 대기중인 현재 Thread에 Interrupt를 호출해도 먹히지 않으며,

Thread Interrupt 상태에 대한 처리가 불가능 해집니다.


그래서 interrupt 상태에 대한 세밀한 제어를 하려면 lockInterruptibly()를 사용하거나, tryLock 함수로 시간 제한을 두고 잠금을 시도하는 방법이 있습니다.

2가지 방법 중 lockInterruptibly() 함수를 이용한 방법을 알아보겠습니다.


lock.lock() 대신 lock.lockInterruptibly()를 사용

현재 스레드가 인터럽트(interrupt) 상태일 때 대기 상태에 들어가는 대신 InterruptedException을 던짐으로써,

현재 스레드가 블럭(block)되지 않도록 할 수 있습니다.


이를 통해, 다른 스레드가 현재 스레드를 인터럽트할 때 즉각적으로 대응할 수 있으며,

대기 상태에 있던 스레드가 대기상태를 벗어나 Interrupt 호출에에 응답하여 예외 처리 루틴을 실행할 수 있습니다.


try-catch 블록에서 try로 lockInterruptibly()를 호출하고 대기상태일떄 Interrupt를 호출하면 InterruptedException에 대한 처리가 가능합니다.

@Override
public void run() {
    try {
        lock.lockInterruptibly(); // 이제 InterruptedException에 반응할 수 있음

        // ...

        if (Thread.currentThread().isInterrupted()) {
            cleanUpAndExit();
        }

    } catch (InterruptedException e) {
        // 인터럽트 발생 시 cleanUpAndExit 호출
        cleanUpAndExit();
    } finally {
        // 락을 성공적으로 획득했으면 해제
        if (lock.isHeldByCurrentThread()) {
            lock.unlock();
        }
    }
}
저작자표시 (새창열림)

'📘 Backend > Concurrency' 카테고리의 다른 글

Binary Semaphore와 Mutex의 차이점  (2) 2024.08.30
ReentrantReadWriteLock - ReadLock & WriteLock을 사용한 Read Thread 성능 향상  (2) 2024.05.03
Atomic Operation & volatile & Metrics  (0) 2024.01.06
Critical Section & Synchronized with Lock  (2) 2024.01.06
Thread 간 Resource 공유 시 발생할 수 있는 문제  (3) 2024.01.06
  1. ReentrantLock - lockInterruptibly()
  2. lockInterruptibly()를 사용해야 하는 이유 - 예시 코드
  3. lock.lock() 대신 lock.lockInterruptibly()를 사용
'📘 Backend/Concurrency' 카테고리의 다른 글
  • Binary Semaphore와 Mutex의 차이점
  • ReentrantReadWriteLock - ReadLock & WriteLock을 사용한 Read Thread 성능 향상
  • Atomic Operation & volatile & Metrics
  • Critical Section & Synchronized with Lock
신건우
신건우
조용한 개발자
  • 신건우
    우주먼지
    신건우
  • 전체
    오늘
    어제
    • 분류 전체보기 (422)
      • 📘 Frontend (71)
        • Markup (1)
        • Style Sheet (2)
        • Dart (8)
        • Javascript (12)
        • TypeScript (1)
        • Vue (36)
        • React (2)
        • Flutter (9)
      • 📘 Backend (143)
        • Java (34)
        • Concurrency (19)
        • Reflection (1)
        • Kotlin (29)
        • Python (1)
        • Spring (42)
        • Spring Cloud (5)
        • Message Broker (5)
        • Streaming (2)
        • 기능 개발 (5)
      • 💻 Server (6)
        • Linux (6)
      • ❌ Error Handling (11)
      • 📦 Database (62)
        • SQL (31)
        • NoSQL (2)
        • JPQL (9)
        • QueryDSL (12)
        • Basic (4)
        • Firebase (4)
      • ⚙️ Ops (57)
        • CS (6)
        • AWS (9)
        • Docker (8)
        • Kubernetes (13)
        • MSA (1)
        • CI & CD (20)
      • 📚 Data Architect (48)
        • Data Structure (10)
        • Algorithm (8)
        • Programmers (17)
        • BaekJoon (5)
        • CodeUp (4)
        • Design Pattern (4)
        • AI (0)
      • ⚒️ Management & Tool (8)
        • Git (7)
        • IntelliJ (1)
      • 📄 Document (10)
        • Project 설계 (6)
        • Server Migration (3)
      • 📄 책읽기 (2)
        • 시작하세요! 도커 & 쿠버네티스 (2)
      • 🎮 Game (4)
        • Stardew Vally (1)
        • Path of Exile (3)
  • 블로그 메뉴

    • 링크

      • Github
    • 공지사항

    • 인기 글

    • 태그

      Lock #Thread #Concurrency
      React #Markdown
      GStreamer #Pipeline
    • 최근 댓글

    • 최근 글

    • hELLO· Designed By정상우.v4.10.0
    신건우
    ReentrantLock - Lock 획득을 위해 대기중인 Thread에 Interrupt 호출이 안먹힐 때
    상단으로

    티스토리툴바

    단축키

    내 블로그

    내 블로그 - 관리자 홈 전환
    Q
    Q
    새 글 쓰기
    W
    W

    블로그 게시글

    글 수정 (권한 있는 경우)
    E
    E
    댓글 영역으로 이동
    C
    C

    모든 영역

    이 페이지의 URL 복사
    S
    S
    맨 위로 이동
    T
    T
    티스토리 홈 이동
    H
    H
    단축키 안내
    Shift + /
    ⇧ + /

    * 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.