假设我有线程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只是将作业放在其中一个队列中,并在打印机/扫描仪准备好时等待(或不执行)它们。
通过这样做,您消除了锁定客户端/生产者端的需要,并让消费者端(打印机和扫描仪)管理他们的作业。
- 使用单个锁
- 如果你决定使用多个锁,总是按照相同的顺序获取它们(例如总是先获取打印机锁,然后再获取扫描仪锁)