1

假设我有线程 t1,t2,t3......t10 并且我需要访问打印机和扫描仪,顺序是首先扫描然后使用这些线程打印,那么我如何确保 t1,t2...t10(由多个用户)可以无死锁地访问扫描仪或打印机。

t1 完成了扫描和等待打印机的工作,现在 t2 正在完成打印文档的工作。那么如何确保 t1 不应该中断工作 t2。现在 t2 完成了打印同一个用户想要扫描另一个文档的工作,但它没有被 t1 释放。所以 t1 和 t2 之间的死锁,t1 想要打印机,t2 想要扫描仪,但他们已经持有其他资源。

4

2 回答 2

4

t1 完成了扫描和等待打印机的工作,现在 t2 正在完成打印文档的工作。那么如何确保 t1 不应该中断工作 t2。

实现这种机制的一个好方法是使用队列,例如线程安全的BlockingQueue并拥有 2 个使用者线程:

  • 从打印机队列中获取作业的打印机线程
  • 从scannerQueue中获取作业的Scanner Thread

然后您的 T0...T10 只需将作业放入其中一个队列中,然后等待(或不等待)它们在打印机/扫描仪准备好时执行。

通过这样做,您无需锁定客户端/生产者端并让消费者端(打印机和扫描仪)管理他们的工作。

于 2013-01-18T09:00:15.207 回答
3
  1. 使用一把锁
  2. 如果您决定使用多个锁,请始终以相同的顺序获取它们(例如,始终先获取打印机锁,然后再获取扫描仪锁)
于 2013-01-18T08:55:11.923 回答