当我们已经锁定它时,如何再次锁定折返锁有用? [重复]

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了当我们已经锁定它时,如何再次锁定折返锁有用? [重复]相关的知识,希望对你有一定的参考价值。

这个问题在这里已有答案:

因此,如果当前线程再次获得锁定,则重入锁定会将计数增加1。我无法理解的是为什么以及如何帮助或使我们受益?

答案

可重入锁定正在执行此操作的原因是不再锁定同一个线程,这已经获得了此锁定。

例如:假设您有线程A正在获取您的重入锁A.比线程B尝试获取锁定A,这将导致线程B被阻止(更多关于线程状态可以找到here)。现在,线程A正试图(再次)获取锁A.

由于重入锁定现在更高,因此线程A不会被阻止。线程A仍然可以访问Lock并且可以继续(锁存储有关深度的信息)。如果他(迟早)释放锁定,计数将再次降低,以检查线程A是否仍然需要锁定。如果计数达到0,意味着线程A已经在每次获取时释放,则线程B将通过锁获得访问权限。

没有重入,你现在将有一个deadlock。为什么?因为线程A有锁并等待再次获取它。


并发可能非常复杂,qazxsw poi帮助(只是一点点)降低了这种复杂性。

另一答案

当您想要调用另一个也需要锁定的方法时,这有助于解决异常情况。

reentrancy

在这里公众可以调用ReentrantLock lock = new ReentrantLock(); public void doSomething() { lock.lock(); try { // Something. } finally { lock.unlock(); } } public void somethingElse () { lock.lock(); try { // Something else. // We can now call another locking method without risking my lock being released. doSomething(); } finally { lock.unlock(); } } 并且它将获得锁定,做它的事情然后在调用doSomething时释放锁定。

但是,当调用unlock并调用somethingElse时,它只会增加锁定计数。当doSomething解锁时它不会释放锁定,它只会计算锁定计数,在doSomething中保留最终解锁以释放锁定。

另一答案

递增锁定计数的点是跟踪线程获取锁定的次数,以便在线程指示准备释放锁定相同次数之前实际不会释放锁定。

假设锁定命令将与释放锁定的命令相匹配。

假设我的代码进入代码区A,这需要锁定。

然后在不退出代码段A的情况下,它进入代码段B,它也需要相同的锁。如你所知,我们有锁,所以我们不需要阻止。

但是我们将离开B部分,写出B部分以在我们退出时释放锁定。 (否则,在没有锁的情况下到达B部分的代码将永远不会释放锁。)

但是我们仍然在A部分,所以我们不想真正放弃锁定,或者当我们在A部分时,另一个线程可以接受它。

因此,当我们输入B部分时,我们增加了锁定计数,这意味着当我们退出B部分时,我们可以将计数减少一个,并且看到它不会回到0,不会释放它。

然后,当A部分再次释放锁定时,计数会回落到0,这就是我们真正让锁定的时候。

以上是关于当我们已经锁定它时,如何再次锁定折返锁有用? [重复]的主要内容,如果未能解决你的问题,请参考以下文章

互斥锁

解锁设备,显示文本,然后再次锁定

当iPhone锁定在iOS5上时,如何防止应用程序被发送终止信号?

初识多线程__下

ORACLE 如何查询被锁定表及如何解锁释放session

如何解除物料的相互锁定