2011-01-25 1 views
4

스레드가 차단 된 상태가 될 수있는 다양한 방법이 있다는 것을 알고 있습니다. 스레드가 차단 된 상태에서 정확히 무슨 일이 일어나는지 알고 싶습니다. 어떻게 다시 실행 상태로 돌아갑니다. sleep (시간)에 의해 차단되면 밀리 초 후에 실행 가능한 대기열로 이동합니다. I/O 작업에서 차단되면 실행 완료 후 실행 가능한 대기열에 들어갑니다. 오브젝트 잠금을 대기 중일 때 실행 가능 대기열에 어떻게 도달합니까? 그 객체에 대한 잠금이 현재 사용 가능하다는 것을 어떻게 알 수 있습니까? 어떤 사람은 I/O에서 차단 된 스레드가 어떻게 작동하는지 내부적으로 설명 할 수 있습니까? 위의 주제에 대한 나의 이해를 잘 작성하지 않은 경우 JVM에서 처리하는 객체 잠금을 대기하여 스레드가 차단 상태가되는 방법

가 감사합니다 .. 제발 올바른

답변

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에 중단됩니다.

monitorentermonitorexit을 구현해야하는 정확한 세부 정보는 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 소스 코드를 볼 수 있습니다. 열려있어.

+0

명시 적으로 Suns/Oracles 핫스팟 JVM을 언급하는 경우이를 분명히 할 수 있습니다. – aioobe

+1

SO 게시물에 대한 JVM 소스 : http://stackoverflow.com/questions/2026093/is-jvm-open-source-code-if-not-how-can-i-get-code-of-jvm – 9dan