ReentrantLock - unlock()方法似乎不适用于列表

时间:2013-11-01 21:00:57

标签: java multithreading unlock reentrantlock

我正在编写一个程序,必须以两种方式修改List。尽管此实现工作正常,但它无法让第二个线程获得锁定:

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;    
}

也许有人知道为什么会这样?

1 个答案:

答案 0 :(得分: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();
}