2011-03-01 43 views
1

我在Java规范中看到了下面的语句。什么是“传统技术”以避免死锁?

程序,其中线程持有多个(直接 或间接)锁 对象应使用常规 技术避免死锁, 创造更高层次的锁定 原语不死锁,如果 必要的。

那么,什么是“传统技术”,以避免死锁?我不清楚这一点(没有正确理解,需要解释)。

+0

遵循层次结构,不交叉锁定。 – bestsss 2011-03-01 13:18:59

回答

3

最常见的技术是以某种一致的明确定义的顺序获取资源(锁)。

Brian Goetz撰写的文章可能会有所帮助:http://www.javaworld.com/javaworld/jw-10-2001/jw-1012-deadlock.html

这是很老,但解释的问题很好。

+0

是的,虽然没有嵌套锁可能会更容易。 – 2011-03-01 13:33:54

+0

或者根本没有锁定 – dty 2011-03-01 17:50:19

+0

或者,根据扩展名,根本不用编程:) - 抱歉,无法抗拒。 – NPE 2011-03-01 17:50:56

1

作为一个有点绝对的建议,对此的回答可能是“有一个处理锁定并坚持它的计划”。

简而言之,锁定的危险在于,一个线程持有锁A,并试图获取锁B,而另一个线程持有锁B并试图获得锁A.正如另一个答案所指出的那样,分类方式为了避免这种情况,请按照一致的顺序获取锁定。但是,一个良好的规范是尽量减少代码在锁定时的工作量。任何调用带锁的另一个函数的代码都是一个潜在的问题:如果其他函数试图获得另一个锁,该怎么办?如果其他人稍后修改该功能以获得锁定,该怎么办?试着形成一个清晰的模式,说明使用锁定可以调用哪些函数,什么不能,并确保代码中的注释使这一切变得清晰。

0

不要锁定!认真。通过保持我们所有的业务逻辑单线程,我们在我的工作中获得了巨大的性能(在亚毫秒延迟下的100k事务)。