Java 의 synchronized, Object. wait (), Object. notify () / notifyAll () 원리

3667 단어
블 로그 소개
 
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
7synchronized (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
5wait() {      unlock(mutex); // mutex      wait_condition(condition); // condition      lock(mutex); // }obj. notify () / notifyAll () 내부 구현 (위조 코드):
1
2
3obj.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.

좋은 웹페이지 즐겨찾기