死锁和等待/通知

时间:2012-07-23 18:04:28

标签: java concurrency

如何使用wait / notify持有多个锁?

想象一下具有两个可锁定资源的情况:打印机和扫描仪。我遇到了死锁因此,我决定在打印机锁定之前获取扫描仪锁。现在如果我只想要打印机,我仍然需要锁定扫描仪。这里的情况是一个(打印)线程到达打印机,它注意到另一个(进给)线程需要送入纸张。我的设计要求打印线程在送纸线上等待送纸。 / p>

如果我在打印机上等待。我想我仍然锁定扫描仪。 线程2如何输入通知代码?

在这种情况下,常用的设计是什么? 说我需要保持2个锁(以避免死锁)。如何在保持两个锁的情况下等待/通知?示例代码如下。

一个明显的方法是在整个代码中反转锁定获取顺序并希望如此  我不需要等待扫描仪。

还有另一种出路吗?

示例代码:打印线程:

    synchronized (scanner) {
        synchronized (printer) {
            // action
            while (trayEmpty) {
                printer.wait();
            }
        }
    }

喂养线程的示例代码:

    synchronized (scanner) {
        synchronized (printer) {
            // action
            trayEmpty=false;
            printer.notify();
        }
    }

2 个答案:

答案 0 :(得分:1)

Is there another way out?

我建议你使用Java Concurrent Api explicit Locks,而不是使用wait / notify,你可以lockunlock按顺序使用

答案 1 :(得分:0)

这个具体案例的一个想法是使用单个锁。例如,在行/ col交叉处的对象上创建一个锁定对象(例如,创建一个锁定对象矩阵)。