Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/306.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
死锁解决——特别是Java_Java_Multithreading_Deadlock - Fatal编程技术网

死锁解决——特别是Java

死锁解决——特别是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的线程类有优先化线程的方

以下是死锁的具体情况:

有两个线程——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)的状态,则这是可行的

这种情况有什么不对

有没有其他/更好的方法来处理这个问题

正如许多文章所指出的,我知道以有序的方式管理对资源的访问

这种情况有什么不对

在正常情况下,两个线程在尝试获取锁时会被阻塞。(如果它们正在使用基本锁(即
已同步
),则无法避免这种情况。)当线程被阻塞时,它们无法检测死锁

或者,如果您使用类似于
Lock.tryLock(longtime,TimeUnit)
的东西,那么线程实际上并没有死锁。您拥有的是一个活动锁,线程在每次超时后都会盲目地重试
tryLock
。解决方法是不重试。如果tryLock调用超时,则将其视为错误

有没有其他/更好的方法来处理这个问题

您可以使用
ThreadMXBean
来检测死锁线程。有关详细信息,请参阅。显然,您必须在另一个线程上执行此操作。。。不在容易死锁的线程上


(我是通过谷歌搜索“Java死锁检测”并阅读答案发现的。)

感谢ans——我将查找Lock.tryLock(…)。我还想知道,如果我在Q.@Roam中的场景有什么问题,那么很清楚,如果您使用
tryLock
(正确),您是在避免死锁,而不是检测死锁。如果不正确地使用它,则将死锁替换为livelock。更好的选择是找到死锁的根本原因并修复它。Stephen C:这回答了我问题的一部分。那么再一次——我的解决方案出了什么问题?@Roam——将其表示为Java代码,我会看一看。不要忽视展示您的算法是如何与获取锁的代码集成的