在Java中有效地同步列表

时间:2015-01-10 18:37:30

标签: java multithreading list concurrency

我有一个列表,一个特定的操作可以影响4个节点 - current,previous,next和head。有什么办法可以锁定这个操作,以便可以自由访问和更改其余的列表条目吗?

我试图找出是否可以获得多个列表条目的锁定但无法找到任何内容。

PS:这是我在生活中玩兼并和多线程的第一天。

1 个答案:

答案 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();
    }
}