java - 当我们已经拥有锁时,再次锁定可重入锁有何帮助?

标签 java locking java.util.concurrent reentrantlock

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

最佳答案

可重入锁执行此操作的原因是不会再次锁定已获取此锁的同一线程。

例如:假设线程 A 正在获取可重入锁 A。线程 B 尝试获取锁 A,这将导致线程 B 被阻塞(有关线程状态的更多信息,请参阅 here )。现在,线程 A 正在尝试(再次)获取锁 A。

由于可重入锁现在增加其计数,因此线程 A 不会被阻塞。线程 A 仍然可以访问锁并可以继续(锁存储有关深度的信息)。如果他(迟早)释放锁,计数将再次降低,以检查线程 A 是否仍然需要锁。如果计数为0,则意味着线程A每次获取锁时都已释放,线程B将获得对锁的访问权。

如果没有重入,您现在将拥有 deadlock 。为什么?因为线程 A 拥有锁并且会等待再次获取它。

<小时/>

并发可能非常复杂,reentrancy有助于(只是一点点)降低这种复杂性。

关于java - 当我们已经拥有锁时,再次锁定可重入锁有何帮助?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52097727/

相关文章:

java - LinkedBlockingQueue - 生产者/消费者

java - ThreadPoolExecutor 与 ExecutorService 的服务超时用例

java - Maven Jaxb 插件无法从目标文件夹生成类

java - 用 Java 读取 csv 文件。用数组列表填充数组列表

mysql - InnoDB 死锁,锁定模式 S 和 X

mysql - 悲观锁如何在数据库中工作,隔离级别是否与它有任何关系?

java - 设计库 - 带有 GridView/listView 的 CoordinatorLayout/CollapsingToolbarLayout

java - Android java for循环突然中断

java - Hazelcast:如何确保集群启动完成

java - 如何设置 Java DelayQueue 的容量