我有一个列表,一个特定的操作可以影响 4 个节点 - 当前、上一个、下一个和头。有什么方法可以锁定此操作,以便可以自由访问和更改其余列表条目?
我尝试找出是否可以获得多个列表条目的锁,但什么也没找到。
PS:这是我第一天接触并发和多线程。
最佳答案
最有效的方法可能是使用节点的索引(保留一个位集,指示哪些节点当前被锁定),但是如果您还想同时向列表(中间)添加或删除节点,那么这会破坏。如果这不是要求,那么也许您应该重新考虑“按索引锁定”的想法。
同时,考虑这样的事情:
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();
}
}
关于java - Java中高效同步列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27879783/