자바 재 접속 잠 금 사망 안내

재 입 잠 금 사 는 자물쇠 와 내장 관 의 잠 금 사 와 매우 비슷 하 다.자물쇠 와 읽 기와 쓰기 자물쇠 두 편의 글 에는 모두 잠 금 사 에 다시 들 어 가 는 문제 가 있다.
하나의 스 레 드 가 자 물 쇠 를 다시 가 져 오고 자 물 쇠 를 읽 거나 다시 들 어 갈 수 없 는 동기 화 기 를 읽 을 때 다시 들 어가 잠 금 이 죽 을 수 있 습 니 다.다시 들 어 갈 수 있다 는 뜻 은 스 레 드 가 이미 가지 고 있 는 자 물 쇠 를 반복 해서 얻 을 수 있다 는 것 이다.자바 의 synchronized 블록 은 다시 들 어 갈 수 있 습 니 다.따라서 아래 코드 는 문제 가 없습니다.
(번역자 주: 여기 서 언급 한 자 물 쇠 는 모두 다시 들 어 갈 수 없 는 자 물 쇠 를 말 합 니 다. 자바 라 이브 러 리 의 Lock 과 ReadWriteLock 류 가 아 닙 니 다)
public class Reentrant{
    public synchronized outer(){
        inner();
    }

    public synchronized inner(){
        //do something
    }
}

outer () 와 inner () 는 모두 synchronized 라 고 밝 혔 습 니 다. 이것 은 자바 에서 synchronized (this) 블록 에 해당 합 니 다.만약 에 특정한 스 레 드 가 outer () 를 호출 하면 outer () 의 inner () 호출 은 문제 가 없습니다. 두 가지 방법 이 모두 같은 관리 대상 (즉 this) 에서 동기 화 되 기 때 문 입 니 다.만약 한 라인 이 어떤 파이프 대상 의 자 물 쇠 를 가지 고 있다 면, 이 파이프 대상 에 동기 화 된 모든 블록 을 방문 할 권리 가 있다.재 입 이 라 고 합 니 다.스 레 드 가 자 물 쇠 를 가지 고 있다 면 이 자 물 쇠 를 사용 하 는 모든 코드 블록 에 다시 접근 할 수 있 습 니 다.
아래 의 이 자물쇠 의 실현 은 다시 들 어 갈 수 없다.
public class Lock{
    private boolean isLocked = false;
    public synchronized void lock()
        throws InterruptedException{
        while(isLocked){
            wait();
        }
        isLocked = true;
    }

    public synchronized void unlock(){
        isLocked = false;
        notify();
    }
}

한 스 레 드 가 두 번 의 lock () 간 에 unlock () 방법 을 호출 하지 않 으 면 두 번 째 호출 lock () 이 막 히 고 다시 잠 금 되 어 죽 습 니 다.
잠 금 사 태 를 피 하려 면 두 가지 선택 이 있 습 니 다.
  • 코드 를 작성 할 때 이미 가지 고 있 는 자 물 쇠 를 다시 가 져 오지 않도록 합 니 다
  • 사용 시 재 접속 가능
  • 어떤 선택 이 당신 에 게 가장 적합 한 항목 인지 에 대해 서 는 구체 적 인 상황 에 따라 결정 해 야 합 니 다.잠 금 을 다시 넣 을 수 있 는 것 은 보통 잠 금 을 다시 넣 지 못 하 는 것 처럼 좋 은 표현 이 없고 실현 이 복잡 하지만 이런 상황 은 당신 의 프로젝트 에서 문제 가 되 지 않 을 수도 있 습 니 다.당신 의 프로젝트 가 자물쇠 로 편 의 를 실현 하 든 잠 그 지 않 는 것 이 편리 하 든 재 입 특성 은 구체 적 인 문제 에 따라 구체 적 으로 분석 해 야 합 니 다.
    Reentrance Lockout 저자 Jakob Jenkov 번역자 류 효 일 교정 정 일 via ifeve

    좋은 웹페이지 즐겨찾기