死锁解决——特别是Java
以下是死锁的具体情况: 有两个线程——T0和T1,以及两个资源——R0和R1 T0持有R0的锁&等待访问R1以释放R0。 T1也在做同样的事情——按住R1,等待R0 我能想到的解决方法是: 经过一段时间的等待——这可能表示这个无限循环,Tx,x=0或1,将Rx的状态写入一个对象Ox,并设置一个标志Fx,表示已经完成了Rx的更新。它还检查标志F(1-x)以查看是否已设置——如果已设置,则从O(1-x)读取状态,相应地进行并释放Rx。在这个场景中,T0和T1被优先化(Java的线程类有优先化线程的方法(?),或者这可以通过一个类实例来实现——在静态变量上使用特定值创建的一个线程负责打破这个循环。) 如果T(1-x)在获取Rx时在R(1-x)上的进一步执行不会改变R(1-x)的状态,则这是可行的 这种情况有什么不对 有没有其他/更好的方法来处理这个问题 正如许多文章所指出的,我知道以有序的方式管理对资源的访问 这种情况有什么不对 在正常情况下,两个线程在尝试获取锁时会被阻塞。(如果它们正在使用基本锁(即死锁解决——特别是Java,java,multithreading,deadlock,Java,Multithreading,Deadlock,以下是死锁的具体情况: 有两个线程——T0和T1,以及两个资源——R0和R1 T0持有R0的锁&等待访问R1以释放R0。 T1也在做同样的事情——按住R1,等待R0 我能想到的解决方法是: 经过一段时间的等待——这可能表示这个无限循环,Tx,x=0或1,将Rx的状态写入一个对象Ox,并设置一个标志Fx,表示已经完成了Rx的更新。它还检查标志F(1-x)以查看是否已设置——如果已设置,则从O(1-x)读取状态,相应地进行并释放Rx。在这个场景中,T0和T1被优先化(Java的线程类有优先化线程的方
已同步
),则无法避免这种情况。)当线程被阻塞时,它们无法检测死锁
或者,如果您使用类似于Lock.tryLock(longtime,TimeUnit)
的东西,那么线程实际上并没有死锁。您拥有的是一个活动锁,线程在每次超时后都会盲目地重试tryLock
。解决方法是不重试。如果tryLock调用超时,则将其视为错误
有没有其他/更好的方法来处理这个问题
您可以使用ThreadMXBean
来检测死锁线程。有关详细信息,请参阅。显然,您必须在另一个线程上执行此操作。。。不在容易死锁的线程上
(我是通过谷歌搜索“Java死锁检测”并阅读答案发现的。)感谢ans——我将查找Lock.tryLock(…)。我还想知道,如果我在Q.@Roam中的场景有什么问题,那么很清楚,如果您使用
tryLock
(正确),您是在避免死锁,而不是检测死锁。如果不正确地使用它,则将死锁替换为livelock。更好的选择是找到死锁的根本原因并修复它。Stephen C:这回答了我问题的一部分。那么再一次——我的解决方案出了什么问题?@Roam——将其表示为Java代码,我会看一看。不要忽视展示您的算法是如何与获取锁的代码集成的