Java 如何确保T线程可以访问n个资源而不发生死锁?

Java 如何确保T线程可以访问n个资源而不发生死锁?,java,multithreading,synchronization,deadlock,Java,Multithreading,Synchronization,Deadlock,假设我有线程t1、t2、t3……t10,我需要访问打印机和扫描仪,顺序是先扫描,然后使用此线程打印,那么我如何确保多个用户可以在无死锁的情况下访问扫描仪或打印机 t1完成了扫描和等待打印机的工作,现在t2正在打印文档。那么,我如何确保t1不应该中断作业t2呢。现在t2完成了他的打印工作,同一个用户想要扫描另一个文档,但t1没有发布。t1和t2之间的死锁,t1需要打印机,t2需要扫描仪,但它们已经占用了其他资源 使用一把锁 如果您决定使用多个锁,请始终以相同的顺序获取它们示例始终先使用打印机锁,然

假设我有线程t1、t2、t3……t10,我需要访问打印机和扫描仪,顺序是先扫描,然后使用此线程打印,那么我如何确保多个用户可以在无死锁的情况下访问扫描仪或打印机

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

使用一把锁 如果您决定使用多个锁,请始终以相同的顺序获取它们示例始终先使用打印机锁,然后再使用扫描仪锁 使用一把锁 如果您决定使用多个锁,请始终以相同的顺序获取它们示例始终先使用打印机锁,然后再使用扫描仪锁 t1完成了扫描和等待打印机的工作,现在t2正在打印文档。那么,我如何确保t1不应该中断作业t2呢

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

从printerQueue获取作业的打印机线程 从扫描队列中获取作业的扫描线程 然后,您的T0…T10只需将作业放入其中一个队列中,并在打印机/扫描仪准备就绪时等待或不执行它们

通过这样做,您无需锁定客户端/生产者端,并让消费者端打印机和扫描仪管理其作业

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

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

从printerQueue获取作业的打印机线程 从扫描队列中获取作业的扫描线程 然后,您的T0…T10只需将作业放入其中一个队列中,并在打印机/扫描仪准备就绪时等待或不执行它们


通过这样做,您就不需要锁定客户端/制作者端,让消费者端的打印机和扫描仪来管理他们的工作。

您的标题和内容不一样。您能否详细说明您认为可能出现死锁的原因?您的标题和内容不一样。您能否详细说明您认为可能出现死锁的原因是僵局?还是3。一次只能持有一个锁,即您当时正在使用的资源上的锁。或3。一次只能持有一个锁,即您当时正在使用的资源上的锁。感谢您宝贵的回答,但我在它们之间存在死锁,如t1想要资源,而t2想要资源由t1持有。@在我描述的场景中,t1和t2不能直接访问资源。相反,他们只是在任何时候将任务放入队列,而不锁定,让资源决定何时准备好处理该任务。@Amol我的答案中的javadoc链接有一个生产者/消费者场景的基本示例。你当然可以找到更完整的例子。只需浏览一下,非常感谢,这真的很有帮助,因为这是正确的方法。始终尽可能避免手动锁定/同步。感谢您宝贵的回答,但我发现它们之间存在死锁,如t1想要资源,而t2想要资源由t1持有。@在我描述的场景中,t1和t2不能直接访问资源。相反,他们只是在任何时候将任务放入队列,而不锁定,让资源决定何时准备好处理该任务。@Amol我的答案中的javadoc链接有一个生产者/消费者场景的基本示例。你当然可以找到更完整的例子。只需浏览一下,非常感谢,这真的很有帮助,因为这是正确的方法。尽可能避免手动锁定/同步。