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我不会多次获得相同的锁,但由于获得了良好的内存访问局部性,多次获得一个锁仍然比多次锁定快。我只需要在整个操作中获得一次锁。