java避免死锁的“常规技术”是什么?
我在Java规范中看到了下面的语句
Programs where threads hold (directly or indirectly) locks on multiple objects should use conventional techniques for deadlock avoidance, creating higher-level locking primitives that don't deadlock, if necessary.
那么,为了避免僵局,应该遵循哪些“常规技巧”?我对此不太清楚(理解不当,需要解释)
# 1 楼答案
不要锁门!认真地通过将所有业务逻辑保持为单线程,我们在工作中获得了巨大的性能(10万个事务,延迟低于毫秒)
# 2 楼答案
最常见的技术是以一致的、定义良好的顺序获取资源(锁)
Brian Goetz的以下文章可能会有所帮助:http://www.javaworld.com/javaworld/jw-10-2001/jw-1012-deadlock.html
它很古老,但很好地解释了问题
# 3 楼答案
作为一个有点抽象的建议,对此的答案可能是“制定一个处理锁的计划并坚持下去”
简而言之,锁定的危险在于,一个线程持有锁A并试图获取锁B,而另一个线程持有锁B并试图获取锁A。正如另一个答案所指出的,避免这种情况的基本方法是以一致的顺序获取锁。然而,一个好的原则是尽量减少代码在保持锁的情况下所做的工作量。任何调用另一个函数并持有锁的代码都是一个潜在的问题:如果另一个函数试图获得另一个锁怎么办?如果其他人后来修改该函数以获得锁呢?尝试形成一个清晰的模式,明确哪些函数可以在锁定的情况下调用,哪些函数不能调用,并确保代码中的注释能够清楚地说明这一点