【发布时间】:2015-01-03 08:24:57
【问题描述】:
这就是我想要用 Java 做的事情:
while(writeSetsIntersect()) {
wait();
}
doStuff
notifyAll();
这就是我卡住的地方:doStuff 如果两个线程写入不同的变量,则可以同时执行,即它们具有不相交的写入集。如果写集相交,线程需要交替。所以我不能简单地将doStuff 放在同步块中,因为它并不总是(并且可能永远不会)需要。
我可以锁定写集中的项目,但是如果两个具有相交写集的线程在同一个锁上等待,可能会发生死锁。如:
Lock[] locks = new Lock[allAvailableVariables.length];
public void getLocks() {
for(i = 0; i < allAvailableVariables.length; i++)
if(i is in writeSet)
locks[i].lock();
}
避免这种情况的最简单方法(据我所知)是同步获取写入集中的锁。但是,如果具有相交写入集的两个线程争相进入同步块,则具有与其他两个不相交的写入集的线程将不得不等到它们离开同步块。
我想我可以只拥有一个自旋锁,但如果可能的话我想避免这种情况,因为评估写入集是否相交可能会很昂贵。
这有意义吗?
【问题讨论】:
标签: java multithreading concurrency synchronization wait