当我们已经锁定它时,如何再次锁定折返锁有用? [重复]
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,这就是我们真正让锁定的时候。
以上是关于当我们已经锁定它时,如何再次锁定折返锁有用? [重复]的主要内容,如果未能解决你的问题,请参考以下文章