在Java中高效地同步列表

在Java中高效地同步列表,java,multithreading,list,concurrency,Java,Multithreading,List,Concurrency,我有一个列表,一个特定的操作可以影响4个节点-当前、上一个、下一个和头部。是否有任何方法可以锁定此操作,以便可以自由访问和更改列表的其余条目 我试图找出一个人是否可以获得多个列表项的锁,但却找不到任何东西 PS:这是我第一天玩并发和多线程 最有效的方法可能是使用节点的索引(保留一个位集,指示当前锁定的节点),但如果您还想同时将节点添加或删除到列表(中间)中,则这将中断。如果这不是要求,那么,也许您应该重新考虑“按索引锁定”的想法 同时,考虑这样的事情: class NodeLocker {

我有一个列表,一个特定的操作可以影响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();
    }
}
class节点记录器{
HashSet lockedNodes=新HashSet();
受保护的布尔tryLock(列表节点){
对于(n:节点){
if(lockedNodes.contains(n))返回false;
}
lockedNodes.addAll(节点);
返回true;
}
公共同步无效锁(节点…节点)引发InterruptedException{
而(!tryLock(Arrays.asList(nodes)))wait();
}
公共同步的无效解锁(节点…节点){
lockedNodes.removeAll(Arrays.asList(nodes));
通知();
}
}

坦白说,我不会在第一天就尝试这样做。只需锁定整个列表。这不是我在生产中推动的代码。:)我只是在学习并尝试了解事物。我帮助找到问题的答案,即使这些问题不合理。:)那么,你能否在你的问题中提供更多的背景?我发现很难提供答案,除非你正在寻找“这是代码”式的答案,我相信你不是。在尝试选择性锁定之前,您应该非常熟悉Java中的同步工作原理。您能否分享您当前的尝试,让我们看看您尝试了什么以及失败的地方?如果所有操作都需要在头部锁定,那么锁定它实际上相当于锁定整个列表。那么,这有什么意义呢?@Dima。这是一个非常好的观点。如果我们只想锁定除head之外的三个节点,程序可以在每个节点上使用isLocked字段,而不是位图集。是的,但是有两个问题。首先,您必须修改底层结构,这甚至可能是不可能和/或不合理的。其次,导航链表以原子方式锁定多个节点有点麻烦,而且可能会变得非常低效,特别是如果您想锁定一组彼此没有直接链接的节点。