1

リストを 2 つの方法で変更する必要があるプログラムを作成しています。この実装は完全に機能しますが、2 番目のスレッドがロックを取得できません。

Node head = new Node(new Object(), null);
public static ReentrantLock lock = new ReentrantLock();
...

boolean add(Object o){
    lock.lock();
    Node current = head;
    Node previous = head.next;

    if(head.next==null){
        head.addNext(new Node(o,null));
        return true;
    }
    while(!(current.next == null)){
        current=current.next;
        previous=previous.next;
    }
    current.addNext(new Node(o,null));
    lock.unlock();
    return true;    
}

多分誰かがそれがなぜなのか知っていますか?

4

1 に答える 1

7

ロック解除の呼び出しを許可しないコードの分岐があります。たとえば、追加で

if(head.next==null){
    head.addNext(new Node(o,null));
    return true;
}

ロックを解除せずに戻ります。lock try finally unlockセマンティクス に従う必要があります。

lock.lock();
try{
   ... do stuff 
   return true;
}finally{
   lock.unlock();
} 
于 2013-11-01T21:05:12.810 に答える