高效地同步 Java 中的列表
Efficiently synchronizing a list in Java
我有一个列表,一个特定的操作会影响 4 个节点 - 当前、上一个、下一个和头。有什么方法可以锁定此操作,以便可以自由访问和更改列表条目的其余部分吗?
我试图找出是否可以获得多个列表条目的锁,但找不到任何东西。
PS:这是我玩并发和多线程的第一天。
最有效的方法可能是使用节点的索引(保留一个位集,指示当前锁定了哪些节点),但是如果您还想同时向(中间)添加或删除节点,那将中断的)名单。如果这不是要求,那么,也许您应该重新考虑 "lock by index" 的想法。
同时,考虑这样的事情:
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();
}
}
我有一个列表,一个特定的操作会影响 4 个节点 - 当前、上一个、下一个和头。有什么方法可以锁定此操作,以便可以自由访问和更改列表条目的其余部分吗?
我试图找出是否可以获得多个列表条目的锁,但找不到任何东西。
PS:这是我玩并发和多线程的第一天。
最有效的方法可能是使用节点的索引(保留一个位集,指示当前锁定了哪些节点),但是如果您还想同时向(中间)添加或删除节点,那将中断的)名单。如果这不是要求,那么,也许您应该重新考虑 "lock by index" 的想法。
同时,考虑这样的事情:
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();
}
}