2014-02-21 1 views
-1
public void handleLinkWeights(LinkWeightMessage m) { //Calculate shortest paths when all edges and peers discovered. 
    peerLock.lock(); 
    int size = m.weights.length; //All lists should be the same size 

    for (int x = 0; x < size; ++x){ 
     NodeMessage a = m.anodes.get(x), 
        b = m.bnodes.get(x); 

     if (hasPeer(a.address, a.port)) { 
      // ... 
     } 
    } 

    peerLock.unlock(); 
    //TODO 
} 

private boolean hasPeer(String address, int port) { 
    peerLock.lock(); 

    peerLock.unlock(); 
} 

위 코드를 실행하면 잠금이 해제됩니까? (코드는 불완전하다.)이렇게하면 어떻게됩니까? (잠금)

peerLock 나머지 문맥에서 유추 할 수있는 ReentrantLock

이다.

+1

시도해 보셨습니까? 'ReentrantLock'을위한 Javadoc을 읽었습니까? –

+0

이 예에서 자물쇠가 분실 될 것이라고 생각하는 이유는 무엇입니까? –

+0

피어 (peer)를 호출하면 자물쇠가 풀리는 원인이되는지 궁금합니다. 자물쇠가 필요한 메서드를 호출하는 것에 대한 설명서가 없습니다. 내가 사용한 대부분의 예제는 동기화를 사용합니다. –

답변

1

문서에 따르면, 나는 자물쇠를 잃지 않을 것이라고 생각합니다. 또한 동일한 스레드가 다시 잠금을 획득하려고 시도 할 경우 증가하는 "보류 카운트"를 사용합니다.

마찬가지로 unlock()의 ​​경우 홀드 카운트가 감소하고 0이면 잠금이 해제됩니다.

public void unlock() 

Attempts to release this lock. 

If the current thread is the holder of this lock then the hold count is decremented. If the hold count is now zero then the lock is released. If the current thread is not the holder of this lock then IllegalMonitorStateException is thrown. 

Specified by: 
    unlock in interface Lock 
Throws: 
    IllegalMonitorStateException - if the current thread does not hold this lock 

그래서는 문서에서 매우 분명하다, handleLinkWeights에서 hasPeer()을 (호출 스레드)의 잠금을 잃지 않을 것입니다.

+0

감사합니다. 어떤 일이 일어나고 구조를 바꿔야 하는지를보고 싶었습니다. –