你会解释锁定顺序吗?

时间:2009-12-23 07:52:49

标签: concurrency locking deadlock

我了解到我应该解锁逆序以锁定订单。 例如。

A.lock();
B.lock();
B.unlock();
A.unlock();

但是,如果我这样做会发生什么:

A.lock();
B.lock();
A.unlock();
B.unlock();

我尝试制作死锁场景, 但如果我总是早先锁定A然后B,那么我不知道会发生什么样的死锁。 你能帮助我吗?

7 个答案:

答案 0 :(得分:40)

在给出的简单情况下,不需要以相反的顺序解锁以避免死锁。

然而,随着代码变得越来越复杂,以相反的顺序解锁会帮助您保持正确的锁定顺序。

考虑:

A.lock();
B.lock();
Foo();
A.unlock();
Bar();
B.unlock();

如果Bar()尝试重新获取A,则您实际上已经破坏了锁定顺序。你拿着B然后试图得到A.现在它可以死锁。

如果您以相反的顺序解锁(如果您使用RAII则非常自然):

A.lock();
B.lock();
Foo();
B.unlock();
Bar();
A.unlock();

然后Bar()尝试锁定并不重要,因为锁定顺序将被保留。

答案 1 :(得分:21)

锁定顺序只是意味着您可以通过以固定顺序获取锁定来防止死锁,并且在开始解锁后不再获取锁定。

我认为解锁的顺序在这里没有任何区别(实际上,即使乱序也应该尽快释放锁定)

答案 2 :(得分:9)

你的榜样永远不会与自己陷入僵局。以相反的顺序解锁并不重要,它以一致的顺序锁定。这将是死锁,即使解锁顺序相反

Thread 1

A.lock();
B.lock();
B.unlock();
A.unlock();

Thread 2

B.lock();
A.lock();
A.unlock();
B.unlock();

答案 3 :(得分:2)

我认为这里不会发生僵局。一般的死锁概念是一个线程等待某个资源被其他线程锁定,而其他线程需要由第一个线程锁定资源来完成并释放首先需要的资源。

Further reading

答案 4 :(得分:1)

解锁的顺序不会影响你的系统陷入僵局的程度,但考虑解锁顺序有一个理由:

为了避免死锁,必须确保您的锁定/解锁配对,因为您永远不会错过解锁。作为一种风格方法,通过明显地拥有负责特定锁定的代码块,可以更容易地在视觉上识别锁定和解锁是否配对。最终结果是,正如您所描述的那样,明确正确的代码可能会采取并释放锁。

答案 5 :(得分:0)

对于Java,如果synchronized,则解锁顺序相反 关键字用于锁定。无法使用synchronized关键字以不同顺序解锁。

synchronized(a) {
  synchronized(b) {
    // statements
  }
}

答案 6 :(得分:0)

webView.evaluateJavaScript("document.getElementsByClassName('pptbutton')[0].click();")

他们的答案很好,这是另一种情况,如果无序的锁定可能会发生死锁。发布已执行。一句话,无序释放&锁定打破了我们用于设计共享资源管理和关键区域的假设。