如何使用wait / notify持有多个锁?
想象一下具有两个可锁定资源的情况:打印机和扫描仪。我遇到了死锁因此,我决定在打印机锁定之前获取扫描仪锁。现在如果我只想要打印机,我仍然需要锁定扫描仪。这里的情况是一个(打印)线程到达打印机,它注意到另一个(进给)线程需要送入纸张。我的设计要求打印线程在送纸线上等待送纸。 / p>
如果我在打印机上等待。我想我仍然锁定扫描仪。 线程2如何输入通知代码?
在这种情况下,常用的设计是什么? 说我需要保持2个锁(以避免死锁)。如何在保持两个锁的情况下等待/通知?示例代码如下。
一个明显的方法是在整个代码中反转锁定获取顺序并希望如此 我不需要等待扫描仪。
还有另一种出路吗?
示例代码:打印线程:
synchronized (scanner) {
synchronized (printer) {
// action
while (trayEmpty) {
printer.wait();
}
}
}
喂养线程的示例代码:
synchronized (scanner) {
synchronized (printer) {
// action
trayEmpty=false;
printer.notify();
}
}
答案 0 :(得分:1)
Is there another way out?
我建议你使用Java Concurrent Api explicit Locks,而不是使用wait / notify,你可以lock
和unlock
按顺序使用
答案 1 :(得分:0)
这个具体案例的一个想法是使用单个锁。例如,在行/ col交叉处的对象上创建一个锁定对象(例如,创建一个锁定对象矩阵)。