Java 의 synchronized, Object. wait (), Object. notify () / notifyAll () 원리
synchronized 와 상호 배척 잠 금 mutex
synchronized 는 특정한 대상 을 잠 그 는 데 사용 되 는데 표준적 인 상호 배척 잠 금 mutex 의 메커니즘 을 나타 낸다. synchronized 코드 블록의 시작 은 lock 이 mutex 이 고 코드 블록의 끝 은 unlock 이다.
Object. wait () 와 조건 변수
Object. wait () 는 사용 할 때 특정한 조건 을 만족 시 키 는 지 여 부 를 판단 하고 외부 조건 cond 에 만족 하지 않 을 때 wait () 를 호출 하여 스 레 드 가 막 히 는 동시에 synchronized 에 잠 긴 mutex 를 방출 합 니 다.이 과정 에서 볼 때 Object. wait () 는 실제 적 으로 조건 변수의 역할 을 합 니 다. wait () 내 부 는 실제 적 으로 synchronized 가 잠 긴 자 물 쇠 를 풀 고 현재 스 레 드 를 내 장 된 조건 condition 에 막 습 니 다.(메모: 이 condition 은 내 장 된 것 입 니 다. 외부 판단 조건 cond 와 같 지 않 습 니 다. 외부 cond 는 프로그래머 가 프로그램 논리 에 따라 변 화 를 판단 해 야 합 니 다. 이 condition 은 Object. notify () / notify All () 에 의 해 변 경 될 수 있 습 니 다. 내 장 된 조건 condition 이 Object. notify () / notify All () 에 의 해 수 정 될 때 까지 이 mutex 를 다시 잠 그 고 wait () 후의 코드 를 계속 실행 할 수 있 습 니 다.
Object. notify () / notifyAll () 과 조건 변수
Object. notify () / notify All () 은 실제 적 으로 하나의 sinal 내 장 된 조건 변수 역할 만 합 니 다. Object. notify () / notify All () 을 호출 한 후, 이때 wait () 에 있 는 다른 스 레 드 가 기다 리 는 내 장 된 조건 변 수 는 만족 하지만, wait () 에 서 는 여전히 lock mutex 가 필요 합 니 다. Object. notify () / notify All () 에 서 는 mutex 를 풀 지 않 았 기 때문에 wait () 에 막 혔 습 니 다.스 레 드 는 계속 기다 리 고 있 습 니 다. 그러나 기다 리 는 조건 은 내 장 된 조건 변수 가 아니 라 mutex 를 잠 그 는 것 입 니 다. synchronized 코드 블록 이 끝 날 때 까지 synchronized 에 잠 긴 mutex 를 자동 으로 방출 하기 때문에 wait () 에서 mutex 를 기다 리 는 모든 스 레 드 가 mutex 경쟁 을 시작 합 니 다. 이 mutex 를 얻 으 면 계속 실 행 됩 니 다. 그렇지 않 으 면 mutex 를 기다 리 고 있 습 니 다.
관련 코드
1
2
3
4
5
6
7
synchronized
(obj) {
// mutex=obj,lock(mutex)
while
(!cond) {
// cond, wait();
obj.wait();
}
// ..... cond
obj.notifyAll();
// condition
}
// mutex=obj,unlock(mutex)
obj. wait () 내부 구현 (위조 코드):
1
2
3
4
5
wait() {
unlock(mutex);
// mutex
wait_condition(condition);
// condition
lock(mutex);
//
}
obj. notify () / notifyAll () 내부 구현 (위조 코드):1
2
3
obj.notify()/notifyAll(){
condition=
true
;
// true
}
메모: 이 코드 에서 while 순환 으로 외부 조건 cond 를 판단 하 는 이 유 는 첫 번 째 Object. notify () / notify All () 때 문 입 니 다.호출 된 후, 모든 스 레 드 가 기다 리 는 내부 조건 condition 이 만족 합 니 다. 이 때 모든 스 레 드 는 mutex 를 경쟁 하고, mutex 는 하나의 스 레 드 만 얻 을 수 있 으 며, 나머지 스 레 드 는 mutex 를 기다 리 고 있 습 니 다. mutex 를 얻 은 스 레 드 가 실 행 될 때 모든 스 레 드 는 mutex 를 경쟁 합 니 다. 이 때, 어떤 스 레 드 는 mutex 를 얻 었 기 때문에 계속 실 행 됩 니 다. 그러나 이 과정 은이 스 레 드 는 외부 조건 cond 의 성립 여 부 를 판단 하지 않 았 습 니 다. mutex 를 처음 얻 은 스 레 드 에서 외부 조건 cond 를 false 로 바 꾸 었 을 수도 있 습 니 다. 현재 mutex 를 얻 은 스 레 드 는 cond 가 true 인지 판단 하지 않 고 후속 코드 를 직접 실행 하 였 습 니 다. 구멍 을 통 해 후속 코드 를 실행 한 것 과 같 으 므 로 프로그램 논리 에 오류 가 발생 할 수 있 습 니 다. 따라서 while 로 외부 코드 를 판단 해 야 합 니 다.부 조건. 이 를 통 해 wait 와 notify 가 기다 리 고 변 경 된 내 장 된 조건 변수 condition 은 반드시 obj 대상 에 있 습 니 다. 이렇게 해야만 obj 에 잠 겨 있 는 모든 스 레 드 가 이 condition 을 공유 할 수 있 습 니 다. 따라서 synchronized 에 잠 겨 있 는 mutex 는 mutex = obj. mutex 이 고 wait 와 notify 가 공유 하 는 내 장 된 조건 변수 condition = obj. condition 으로 추정 할 수 있 습 니 다.총결산
synchronized, Object. wait (), Object. notify () / notify All () 을 사용 하여 스 레 드 동기 화 를 실현 할 때 두 가지 메커니즘 을 사 용 했 습 니 다. 스 레 드 상호 배척 잠 금 mutex 와 조건 변수 condition.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.