java - 有选择地实现同步以促进最大并发性

标签 java multithreading concurrency synchronization wait

这是我尝试用 Java 做的事情:

while(writeSetsIntersect()) {
    wait();
}    
doStuff    
notifyAll();

这是我卡住的地方:doStuff 如果两个线程写入不同的变量,即它们具有不相交的写入集,则可以同时执行。如果写集相交,则线程需要交替。所以我不能简单地将 doStuff 放在同步块(synchronized block)中,因为它并不总是(而且可能永远不会)是必需的。

我可以锁定写集中的项目,但如果两个具有相交写集的线程在同一个锁上等待,则可能会发生死锁。如:

Lock[] locks = new Lock[allAvailableVariables.length];
public void getLocks() {
    for(i = 0; i < allAvailableVariables.length; i++)
        if(i is in writeSet)
            locks[i].lock();
}

避免这种情况的最简单方法(据我所知)是同步获取写入集中的锁。但是,如果具有相交写集的两个线程争相进入同步块(synchronized block),则具有与其他两个写集不相交的写集的线程将不得不等到它们离开同步块(synchronized block)。

我想我可以只使用一个自旋锁,但我想尽可能避免这种情况,因为评估写集是否相交可能会很昂贵。

这有什么意义吗?

最佳答案

看起来你想使用锁排序。

将锁按某种自然顺序排序。然后依次锁定每个。

假设你有锁 aba < b .如果两个线程都想同时锁定 ab , 他们都会锁定 a第一的。所以你不会有线程被锁定的情况 b并在 a 上被屏蔽,而另一个线程已锁定 ab 上被屏蔽.

关于java - 有选择地实现同步以促进最大并发性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26786096/

相关文章:

java - 回调 Lambda 表达式 + JavaFX

java - 使用Java在opencv中的网络摄像头流

java - 编译器能够优化引用创建吗?

python:使用队列将字典传递给另一个线程

python - 什么是 Python 线程 + Unix 信号语义?

design-patterns - 基于任务的异步模式和基于事件的异步模式有什么区别?

java - PLAF 无法更改按钮颜色

multithreading - 用整数数学分割文件

mysql - SQL 最后插入到 Drupal 中。它真的是线程安全的吗?

java - 我应该怎么做才能防止 UI 卡住(scheduledexecutorservice)