java - Java中高效同步列表

标签 java multithreading list concurrency

我有一个列表,一个特定的操作可以影响 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/

相关文章:

python 在永无止境的进程上运行覆盖

c++ - helgrind (valgrind) 可以与 c++11 future 一起使用吗

Python 将一个列表中的元素与另一个列表中的所有元素合并

python - 具有可变长度列表的 Format()

java - 是否有用于 Java 的请求-响应网络 API?

静态成员变量的 C++ 线程安全

java - 服务器应用程序 : Only works with a println output

c - 在循环列表中添加节点

java - 运行 JavaFX 应用程序时发生 fatal error JRE(调整大小/场景更改)

java - 开放图 - 操作类型必须获得用户生成照片的批准