2010-08-05 6 views
2

사이트 내 http://download-llnw.oracle.com/javase/tutorial/essential/concurrency/starvelive.html 여기에는 스레드가 차단되지 않았고 이후 스레드가 차단되었다고하는 라이브 록의 개념이 있습니다 ... "그들은 여전히 ​​서로를 차단하고 있습니다" 그래서 잘 이해가 안돼 ... 차단 된 경우 교착 상태처럼 보입니다 ...스레드 라이브 의심 의심

Java에서보고 된 Alphonse 및 Gaston 예제를 시뮬레이트 할 수 있다면 누구나 나에게 간단한 라이브 코드 상황을 제출할 수 있습니까? 대지?

+0

흥미 롭습니다. 필자는 파이프를 통해 데이터를 교환하는 두 개의 스레드를 포함하는 "라이브 록"과 완전히 다른 정의를 보았습니다. 그리고 보낸 사람은 플러시를 잊어 버려서 독자가 데이터를 무기한 대기하도록합니다. – finnw

+0

+1 매우 흥미 롭습니다. – naikus

답변

1

교착 상태가 발생하면 두 개 이상의 스레드가 있습니다. 각 스레드는 하나의 잠금을 보유하고 있으며 다른 잠금을 획득해야합니다. 각 스레드는 다른 스레드가 보유하고있는 잠금 장치에서 잠자고 있습니다. 그들이 잠 들어 있기 때문에, 그들은 "죽었다"- 코드를 실행하지 않고, 그들은 결코 않을 것이다.

라이브 록이있는 경우 두 개 이상의 스레드가 실행 중이며 코드를 실행하고 있지만 라이브 잠금의 다른 스레드에서 발생한 이벤트에 응답하기에는 너무 바빠서 코드의 조건을 계속 수행 할 수 없습니다.

내 자바는이 시점에서 심각하게 녹슨, 그래서는 희망-간단한 설명과 함께 가자 다음을 먹고 (

두 스레드, AB이 어떤 작업을 수행하기 위해 잠금 12을 취득해야 샌드위치) :이 두 항상 스레드 다른 방법은, 어느 하나가 지금까지 에게 샌드위치를 ​​먹을 경우

Thread A tries this: 

Acquire lock 1 
if try_lock(2) == success 
    eat the sandwich 
else 
    drop 1 
    sleep a bit 
    go back to start 


Thread B tries this: 

Acquire lock 2 
if try_lock(1) == success 
    eat the sandwich 
else 
    drop 2 
    sleep a bit 
    go back to start 

가 : 그들은 둘 다 떨어 잠금을 획득, 테스트 및 모든 시간을 할애하지만 일 아이는 앞으로 나아갈 수 없다.