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 - Fatal编程技术网

Java 避免死锁的“常规技术”是什么?

Java 避免死锁的“常规技术”是什么?,java,multithreading,Java,Multithreading,我在Java规范中看到了下面的语句 线程直接保存的程序 或间接锁定多个 对象应使用常规 避免死锁的技术, 创建更高级别的锁定 不死锁的原语,如果 必要的 那么,为了避免死锁,应该遵循哪些常规技术呢?我对此不太清楚,没有正确理解,需要解释。最常用的技术是以一致的、定义良好的顺序获取资源锁 Brian Goetz的以下文章可能会有所帮助: 它非常古老,但很好地解释了问题。最常用的技术是以一致的定义良好的顺序获取资源锁 Brian Goetz的以下文章可能会有所帮助: 它非常古老,但很好地解释了问题。

我在Java规范中看到了下面的语句

线程直接保存的程序 或间接锁定多个 对象应使用常规 避免死锁的技术, 创建更高级别的锁定 不死锁的原语,如果 必要的


那么,为了避免死锁,应该遵循哪些常规技术呢?我对此不太清楚,没有正确理解,需要解释。

最常用的技术是以一致的、定义良好的顺序获取资源锁

Brian Goetz的以下文章可能会有所帮助:


它非常古老,但很好地解释了问题。

最常用的技术是以一致的定义良好的顺序获取资源锁

Brian Goetz的以下文章可能会有所帮助:


它非常古老,但很好地解释了问题。

作为一个有点抽象的建议,对此的答案可能是制定一个处理锁的计划并坚持执行


简而言之,锁定的危险在于,一个线程持有锁A并试图获取锁B,而另一个线程持有锁B并试图获取锁A。正如另一个答案所指出的,避免这种情况的基本方法是以一致的顺序获取锁。然而,一个好的原则是尽量减少代码在保持锁的情况下所做的工作量。任何调用另一个函数并持有锁的代码都是一个潜在的问题:如果另一个函数试图获得另一个锁怎么办?如果其他人后来修改该函数以获得锁呢?尝试形成一个清晰的模式,明确哪些函数可以在锁保持的情况下调用,哪些函数不能调用,并确保代码中的注释能够清楚地说明这一点。

作为一个略带删减的建议,解决这个问题的方法可能是制定一个处理锁的计划并坚持下去


简而言之,锁定的危险在于,一个线程持有锁A并试图获取锁B,而另一个线程持有锁B并试图获取锁A。正如另一个答案所指出的,避免这种情况的基本方法是以一致的顺序获取锁。然而,一个好的原则是尽量减少代码在保持锁的情况下所做的工作量。任何调用另一个函数并持有锁的代码都是一个潜在的问题:如果另一个函数试图获得另一个锁怎么办?如果其他人后来修改该函数以获得锁呢?尝试形成一个清晰的模式,明确哪些函数可以在锁定的情况下调用,哪些函数不能调用,并确保代码中的注释能够清楚地说明这一点。

不要执行锁定!认真地通过将所有业务逻辑保持为单线程,我们在工作中以低于毫秒的延迟获得了10万个事务的巨大性能。

不要锁定!认真地通过将所有业务逻辑保持为单线程,我们在工作中以亚毫秒的延迟获得了10万个事务的卓越性能。

遵循层次结构,不要交叉锁定。遵循层次结构,不要交叉锁定。是的,虽然不嵌套锁可能会更容易。或者,从广义上讲,根本不编程:-抱歉,无法抗拒。是的,虽然不嵌套锁可能会更容易。或者,扩展一下,根本不编程:-抱歉,无法抗拒。