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

时间:2013-01-18 08:51:41

标签: java multithreading synchronization deadlock

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

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

2 个答案:

答案 0 :(得分:4)

  

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

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

  • 从printerQueue
  • 获取作业的打印机线程
  • 从scannerQueue
  • 获取作业的扫描仪线程

然后你的T0 ... T10只是将作业放在其中一个队列中,等待(或不等待)它们在打印机/扫描仪就绪时执行。

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

答案 1 :(得分:3)

  1. 使用一个锁
  2. 如果您决定使用多个锁,则始终以相同的顺序获取它们(例如,首先将打印机锁定,然后再锁定扫描仪锁定)