我有一个列表,一个特定的操作可以影响4个节点 - current,previous,next和head。有什么办法可以锁定这个操作,以便可以自由访问和更改其余的列表条目吗?
我试图找出是否可以获得多个列表条目的锁定但无法找到任何内容。
PS:这是我在生活中玩兼并和多线程的第一天。
答案 0 :(得分:1)
最有效的方法可能是使用节点的索引(保留一个位集,指示哪些节点当前被锁定),但是如果你还想同时添加或删除节点(中间),这将会中断列表。如果这不是要求,那么,或许,您应该重新审视"锁定索引"理念。
同时,考虑这样的事情:
class NodeLocker {
HashSet<Node> lockedNodes = new HashSet();
protected boolean tryLock(List<Node> nodes) {
for(n: Nodes) {
if(lockedNodes.contains(n)) return false;
}
lockedNodes.addAll(nodes);
return true;
}
public synchronized void lock(Node ... nodes) throws InterruptedException {
while(!tryLock(Arrays.asList(nodes))) wait();
}
public synchronized void unlock(Node ... nodes) {
lockedNodes.removeAll(Arrays.asList(nodes));
notify();
}
}