如何确保1个线程可以访问n个资源而不会死锁?



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

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

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

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

  • 从prininterqueue
  • 接收作业的打印机线程
  • 从scannerQueue
  • 接收任务的扫描器线程

那么你的T0…T10只是将作业放在其中一个队列中,并在打印机/扫描仪准备好时等待(或不执行)它们。

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

  1. 使用单个锁
  2. 如果你决定使用多个锁,总是按照相同的顺序获取它们(例如总是先获取打印机锁,然后再获取扫描仪锁)

最新更新