这是我尝试用 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)。
我想我可以只使用一个自旋锁,但我想尽可能避免这种情况,因为评估写集是否相交可能会很昂贵。
这有什么意义吗?
最佳答案
看起来你想使用锁排序。
将锁按某种自然顺序排序。然后依次锁定每个。
假设你有锁 a
和 b
与 a < b
.如果两个线程都想同时锁定 a
和 b
, 他们都会锁定 a
第一的。所以你不会有线程被锁定的情况 b
并在 a
上被屏蔽,而另一个线程已锁定 a
在 b
上被屏蔽.
关于java - 有选择地实现同步以促进最大并发性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26786096/