java - 如何保证T线程可以访问n个资源而不死锁?

标签 java multithreading synchronization deadlock

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

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

最佳答案

t1 finishes his job of scanning and waiting for printer and now t2 is doing job of printing the doc. So how do I ensure that t1 should not interrupt the job t2.

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

  • 从打印机队列中获取作业的打印机线程
  • 从 scannerQueue 获取作业的扫描器线程

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

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

关于java - 如何保证T线程可以访问n个资源而不死锁?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14395289/

相关文章:

Python 操作系统错误 : [Errno 98] Address already in use but no port is used

.net - Interlocked.Xxx 方法是否保证在所有数据缓存中更新值?

java - 来自java的日期时间不同步(tomcat 7)

MS Access 与 MySQL 的 PHP 编程和自动同步

java - 为什么没有 null == null 的警告?

java - 用很多分隔符分割字符串

java - 如何在 Java 中防止 403 HTTP 错误代码?

java - 从 cassandra DB 检索所有行的有效方法

c++ - SethreadAffinityMask() 正确用法?

ios - Pubnub 阻止排毒同步