자바 재 접속 잠 금 사망 안내
하나의 스 레 드 가 자 물 쇠 를 다시 가 져 오고 자 물 쇠 를 읽 거나 다시 들 어 갈 수 없 는 동기 화 기 를 읽 을 때 다시 들 어가 잠 금 이 죽 을 수 있 습 니 다.다시 들 어 갈 수 있다 는 뜻 은 스 레 드 가 이미 가지 고 있 는 자 물 쇠 를 반복 해서 얻 을 수 있다 는 것 이다.자바 의 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
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
java. util. concurrent 패키지 의 해체@Date 2019-7-8 11:25*/public class BlockingQueueExample {public static void main(String[] args) {BlockingQueue blockingQ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.