高效地同步 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();
    }
}