是否应该避免嵌套锁定请求?

时间:2014-02-12 10:37:15

标签: java multithreading thread-safety locking buffer

我有一个java类,它接收来自外部的输入(即同时运行的许多线程),然后将输入存储到两个循环缓冲区中。这些缓冲区协同工作以执行相同的工作,并且仅根据其优先级而不同。也就是说,缓冲区被命名为“primary”和“secondary”:当输入到达时,首先检查主缓冲区,如果它已满,则检查辅助缓冲区。即使辅助缓冲区已满,输入也会等待其中一个缓冲区中的插槽可用。我认为我可以通过首先锁定主缓冲区上的访问权限来管理并发性,并且仅在必要时请求锁定辅助缓冲区,同时仍然保持先前的锁定。 我不知道为什么,但对我来说听起来很奇怪。只要它不会导致死锁或繁重的饥饿场景,同时持有两个锁定好/安全的实践吗?

感谢您的关注。

1 个答案:

答案 0 :(得分:0)

如果您不能保证始终以相同的顺序获取两个锁,则有死锁的风险。
如果可以保证在进入内锁时始终握住外锁,则内锁是多余的。 (*)
如果可以保证如果代码拥有内部锁,则其他任何代码都不会请求外部锁,那么这不会导致死锁。但是,这很脆弱,因为现在您正在考虑通常距离很远的代码。除非有一个外部-外部锁来确保不会同时获取该外部锁,否则您将回到上述两种情况之一。

是的,您应该避免嵌套锁:要么死锁,要么毫无用处,要么系统脆弱。

(*)此处有一个例外:如果外锁代码区域启动使用内锁进行协调的线程,则此规则不适用。
这种代码非常少见,与您在实践中看到的嵌套锁场景不同,即使从技术上来讲,我什至都不愿意将其称为嵌套锁。