Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/379.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java ReentrantLock-unlock()方法不';我似乎无法处理列表_Java_Multithreading_Unlock_Reentrantlock - Fatal编程技术网

Java ReentrantLock-unlock()方法不';我似乎无法处理列表

Java ReentrantLock-unlock()方法不';我似乎无法处理列表,java,multithreading,unlock,reentrantlock,Java,Multithreading,Unlock,Reentrantlock,我正在写一个程序,必须用两种方式修改列表。尽管此实现工作正常,但它无法让第二个线程获得锁: 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;

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

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

也许有人知道这是为什么?

有些代码分支永远不会允许调用解锁。例如在add中

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

有些代码分支永远不允许调用解锁。例如在add中

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

看起来有一个带有长度字段的链表似乎很奇怪…因为获得锁比执行的操作慢得多,如果每个列表(而不是每个节点)只有一个锁,代码会更快更简单。这是我的另一个错误,感谢您指出这一点。@PeterLawrey为什么在X个不同的锁上锁定X次(从不同时)比在一个锁上锁定X次(也从不同时)慢?@rolfl我不会多次获得相同的锁,但由于获得了良好的内存访问局部性,多次获得一个锁仍然比多次锁定快。我只需要在整个操作中获得一次锁。看起来有一个带有长度字段的链表似乎很奇怪…因为获得锁比您正在执行的操作慢得多,如果您每个列表(而不是每个节点)只有一个锁,代码会更快更简单。这是我的另一个错误,感谢您指出这一点。@PeterLawrey为什么在X个不同的锁上锁定X次(从不同时)比在一个锁上锁定X次(也从不同时)慢?@rolfl我不会多次获得相同的锁,但由于获得了良好的内存访问局部性,多次获得一个锁仍然比多次锁定快。我只需要在整个操作中获得一次锁。