VisualVM을 사용하여 다중 스레드 Java 응용 프로그램을 연결하고 스레드에는 실행 중, 잠자기, 대기, 모니터의 4 가지 상태가 있습니다. 이 모니터링 상태는 무엇을 의미합니까? 대기와 모니터의 차이점은 무엇입니까?
답변:
이러한 상태는 Thread.State
열거 형에 언급 된 것과 동일합니다 . "기다림"은 문서에 나와있는 것처럼 다음을 의미합니다.
스레드는 다음 메소드 중 하나를 호출하여 대기 상태에 있습니다.
- 제한 시간이없는 Object.wait
- 시간 제한없이 Thread.join
- LockSupport.park
"모니터"는 BLOCKED
스레드가 객체에 대한 잠금을 얻기 위해 대기하는 synchronized
상태입니다 (다른 스레드가 이미 연관된 잠금을 보유하고있는 동안 블록 또는 메소드 에 들어 가려고하기 때문입니다 ).
sleeping
과 waiting
스크린 샷에서 보여?!
모니터는 스레드가 객체에 대한 잠금을 얻기 위해 기다리고 있음을 의미합니다. 예를 들어 한 스레드가 동기화 된 메서드를 실행 중이고 다른 스레드가 동일한 개체에서이를 호출하려고 할 때 메서드의 첫 번째 호출이 완료 될 때까지 사용할 수 없습니다. 첫 번째 스레드에는 해당 개체에 대한 모니터 또는 잠금이 있으므로 두 번째 스레드는 해제 될 때까지 기다려야하기 때문입니다.
에서 오라클 스레딩 자습서 :
"동기화는 고유 잠금 또는 모니터 잠금으로 알려진 내부 엔티티를 중심으로 구축됩니다. API 사양에서는 종종이 엔티티를 단순히"모니터 "라고합니다.) 고유 잠금은 동기화의 두 측면에서 역할을합니다. 개체의 상태와 가시성에 필수적인 관계를 구축하기 전에 발생합니다. "