Java 에서 notify()와 notifyAll()의 사용 차이
5343 단어 Javanotify()notifyAll()
두 개념 을 먼저 해석 하 다.
4.567917 대기 탱크:하나의 스 레 드 A 가 특정한 대상 의 wait()방법 을 호출 했다 고 가정 하면 스 레 드 A 는 이 대상 의 자 물 쇠 를 풀 고 이 대상 의 대기 탱크 에 들 어가 서 대기 탱크 의 스 레 드 가 이 대상 의 자 물 쇠 를 경쟁 하지 않 습 니 다4.567917.잠 금 풀:대상 의 자 물 쇠 를 가 져 와 야 스 레 드 가 대상 의 synchronized 코드 를 실행 할 수 있 습 니 다.대상 의 자 물 쇠 는 매번 하나의 스 레 드 만 얻 을 수 있 고 다른 스 레 드 는 잠 금 풀 에서 만 기다 릴 수 있 습 니 다그리고 notify 와 notify All 의 차 이 를 말씀 드 리 겠 습 니 다.
4.567917.스 레 드 가 대상 의 wait()방법 을 호출 하면 스 레 드 는 이 대상 의 대기 탱크 에 있 고 대기 탱크 의 스 레 드 는 이 대상 의 자 물 쇠 를 경쟁 하지 않 습 니 다
이러한 이론 적 기반 이 있 으 면 뒤의 notify 는 잠 금 을 초래 할 수 있 고 notify All 은 그렇지 않 은 예 로 해석 할 수 있다.
테스트 코드
public class TestNotifyNotifyAll {
private static Object obj = new Object();
public static void main(String[] args) {
// RunnableImplA wait()
Thread t1 = new Thread(new RunnableImplA(obj));
Thread t2 = new Thread(new RunnableImplA(obj));
t1.start();
t2.start();
//RunnableImplB notify()
Thread t3 = new Thread(new RunnableImplB(obj));
t3.start();
// //RunnableImplC notifyAll()
// Thread t4 = new Thread(new RunnableImplC(obj));
// t4.start();
}
}
class RunnableImplA implements Runnable {
private Object obj;
public RunnableImplA(Object obj) {
this.obj = obj;
}
public void run() {
System.out.println("run on RunnableImplA");
synchronized (obj) {
System.out.println("obj to wait on RunnableImplA");
try {
obj.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("obj continue to run on RunnableImplA");
}
}
}
class RunnableImplB implements Runnable {
private Object obj;
public RunnableImplB(Object obj) {
this.obj = obj;
}
public void run() {
System.out.println("run on RunnableImplB");
System.out.println(" 3 ...");
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
synchronized (obj) {
System.out.println("notify obj on RunnableImplB");
obj.notify();
}
}
}
class RunnableImplC implements Runnable {
private Object obj;
public RunnableImplC(Object obj) {
this.obj = obj;
}
public void run() {
System.out.println("run on RunnableImplC");
System.out.println(" 3 ...");
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
synchronized (obj) {
System.out.println("notifyAll obj on RunnableImplC");
obj.notifyAll();
}
}
}
결과:obj.notify()를 한 번 만 호출 합 니 다.스 레 드 t1 또는 t2 중 하 나 는 깨 어 나 기 를 기다 리 고 있 습 니 다.프로그램 이 종료 되 지 않 습 니 다.run on RunnableImplA
obj to wait on RunnableImplA
run on RunnableImplA
obj to wait on RunnableImplA
run on RunnableImplB
잠 3 초...
notify obj on RunnableImplB
obj continue to run on RunnableImplA
t3 주 를 떨 어 뜨리 고 t4 스 레 드 를 시작 합 니 다.obj.notifyAll()방법 호출
public class TestNotifyNotifyAll {
private static Object obj = new Object();
public static void main(String[] args) {
// RunnableImplA wait()
Thread t1 = new Thread(new RunnableImplA(obj));
Thread t2 = new Thread(new RunnableImplA(obj));
t1.start();
t2.start();
// //RunnableImplB notify()
// Thread t3 = new Thread(new RunnableImplB(obj));
// t3.start();
//RunnableImplC notifyAll()
Thread t4 = new Thread(new RunnableImplC(obj));
t4.start();
}
}
결과:t1,t2 스 레 드 모두 실행 가능run on RunnableImplA
obj to wait on RunnableImplA
run on RunnableImplA
obj to wait on RunnableImplA
run on RunnableImplC
잠 3 초...
notifyAll obj on RunnableImplC
obj continue to run on RunnableImplA
obj continue to run on RunnableImplA
자바 의 notify()와 notify All()의 사용 차이 에 관 한 이 글 은 여기까지 소개 되 었 습 니 다.더 많은 자바 notify()와 notify All()내용 은 우리 의 이전 글 을 검색 하거나 아래 의 관련 글 을 계속 찾 아 보 세 요.앞으로 도 많은 응원 부 탁 드 리 겠 습 니 다!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
JPA + QueryDSL 계층형 댓글, 대댓글 구현(2)이번엔 전편에 이어서 계층형 댓글, 대댓글을 다시 리팩토링해볼 예정이다. 이전 게시글에서는 계층형 댓글, 대댓글을 구현은 되었지만 N+1 문제가 있었다. 이번에는 그 N+1 문제를 해결해 볼 것이다. 위의 로직은 이...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.