스레드가 차단 된 상태가 될 수있는 다양한 방법이 있다는 것을 알고 있습니다. 스레드가 차단 된 상태에서 정확히 무슨 일이 일어나는지 알고 싶습니다. 어떻게 다시 실행 상태로 돌아갑니다. sleep (시간)에 의해 차단되면 밀리 초 후에 실행 가능한 대기열로 이동합니다. I/O 작업에서 차단되면 실행 완료 후 실행 가능한 대기열에 들어갑니다. 오브젝트 잠금을 대기 중일 때 실행 가능 대기열에 어떻게 도달합니까? 그 객체에 대한 잠금이 현재 사용 가능하다는 것을 어떻게 알 수 있습니까? 어떤 사람은 I/O에서 차단 된 스레드가 어떻게 작동하는지 내부적으로 설명 할 수 있습니까? 위의 주제에 대한 나의 이해를 잘 작성하지 않은 경우 JVM에서 처리하는 객체 잠금을 대기하여 스레드가 차단 상태가되는 방법
가 감사합니다 .. 제발 올바른
4
A
답변
3
어떻게이 객체가 잠에 대기하는 실행 가능한 큐에 도착합니까? 다른 스레드 (로크 채) 같은 객체의
synchronized
블록으로부터 출사하여 잠금을 해제 할 때
스레드가 때문에 synchronized
블록을 입력하려고로 차단 된 경우에는, 스레드가 자동으로 실행 가능한 것으로 표시된 .
someObject.wait()
에 대한 호출로 인해 현재 스레드가 차단 된 경우 다른 스레드가 someObject.notify()
을 호출하면 스레드가 "해제"됩니다. 다음과 같이 바이트 코드 수준에
은 보인다 : 다른 사람이 이미 obj
의 잠금을 보유하는 경우 다른 스레드가 monitorexit
를 호출 할 때까지
[load some object, obj, onto the operand stack]
monitorenter // grab the lock
// do stuff
[load obj onto the operand stack again]
monitorexit // release the lock
스레드는 monitorenter
에 중단됩니다.
monitorenter
및 monitorexit
을 구현해야하는 정확한 세부 정보는 JLS에서 지정하지 않습니다. 즉, JVM/OS에 종속적입니다.
자세한 내용은 JLS Wait Sets and Notifications을 참조하십시오. 근접에 코드 수준에
0
그것은 다음과 같습니다
스레드 1 :
Object mutex = new Object();
....
synchronized(mutex) {
//lock to mutex is acquired.
mutex.wait(); //lock to mutex is released. Thread is waiting for somebody to call notify().
doSomething();
}
스레드 2 : 일반적으로
synchronized(Thread1.mutex) {
//acquires the lock on mutex.
//Can be done only after mutex.wait() is called from Thread1
// and the lock is released
Thread1.mutex.notify(); // notifies Thread1 that it can be resumed.
}
당신이 마음 스레드에 보관해야 .sleep()은 자원에 대한 잠금을 유지하지만 Thread.wait()는 잠금을 해제하고 다른 스레드에 의해 통지 될 수 있습니다.
0
AFAIK JVM은 원시 스레드를 사용합니다. 따라서 스레드 스케줄 및 컨텍스트 스위칭을 관리하는 것이 OS가 아닌 JVM입니다.
실제 JVM 소스 코드를 볼 수 있습니다. 열려있어.
명시 적으로 Suns/Oracles 핫스팟 JVM을 언급하는 경우이를 분명히 할 수 있습니다. – aioobe
SO 게시물에 대한 JVM 소스 : http://stackoverflow.com/questions/2026093/is-jvm-open-source-code-if-not-how-can-i-get-code-of-jvm – 9dan