当前位置: 首页 > 知识库问答 >
问题:

ReentrantLock--为什么我们需要多次获取一个锁?

席言
2023-03-14

共有1个答案

巢权
2023-03-14

为什么我们需要多次获取锁?

很明显,你不需要。但应用程序“偶然”做到这一点并不罕见。例如:

  public void binaryOperation(Operand op1, Operand op2) {
      synchronized (op1) {
          synchronized (op2) {
               // do something that needs the locks
          }
      }
  }

  // now call passing the same object for both operands
  Operand op = ...
  binaryOperation(op, op); 

在本例中,op对象实际上将被锁定两次。如果原语锁不是可重入的,这可能会失败(或死锁)。

“导致当前线程等待,直到另一个线程调用此对象的notify()方法或notifyAll()方法,或者已经过了指定的时间。”

对于wait()wait(timeout),调用方可以检查它希望得到“通知”的条件是否实际满足。(请参见关于“虚假唤醒”的注释...和示例代码。)

wait(long timeout)比wait()方法有什么优势?

但是在reentrantlock的情况下,在哪个对象上获取锁?

严格来说,是锁本身。锁的实际含义将取决于如何编写类。但这与原始互斥完全相同。

Java中的锁定并不能阻止某些行为不端的代码在不持有锁的情况下访问或更新某些共享状态。要由程序员来正确地做这件事。

在可重入锁定的情况下(即,线程试图在持有锁a的同时获取锁a的情况下),reentrantlock实现会注意到持有锁的线程就是获取锁的线程。一个计数器递增,这样实现就知道锁必须释放两次。

在这种情况下,如何使用ReentrantLock避免死锁?也许我们可以使用tryLock(),并为未能获得锁的线程提供一个替代操作。

这是一种方法。

然后设计逻辑以避免死锁;见上面的备选方案!

问题4。

但是为什么我们要多次获取lock呢?

 类似资料:
  • 我知道如果使用ReentrantLock,它允许同一个线程多次获取同一个锁。在内部,它有一个计数器来计算锁获取的次数。如果您两次获得相同的锁,则需要释放两次。但我的问题是,如果一次获取就足够了,为什么有人想要多次获取锁?有人能给我一个通用用例吗?

  • 本文向大家介绍为什么我们需要一个数据库,包括了为什么我们需要一个数据库的使用技巧和注意事项,需要的朋友参考一下 数据库是数据的集合,通常以电子形式存储。数据库的设计通常是为了使其易于存储和访问信息。 好的数据库对任何公司或组织都至关重要。这是因为数据库存储了有关公司的所有相关详细信息,例如员工记录,交易记录,工资详细信息等。 数据库重要的各种原因是- 管理大量数据 数据库每天存储和管理大量数据。使

  • 我在这里(有点)了解jdk 5 Reentry antLock的功能 但为什么我们想要一个“再进入者”锁呢?i、 e如果一个线程已经锁定了一个对象,为什么它需要再次获取它?

  • 问题内容: 我的问题就像标题说的那样:为什么我们需要9个补丁的图像?他们真的那么重要吗?其实,他们真正在做什么?我没有清楚地了解9色块图像的概念。 我知道9补丁图像是可伸缩的。因此,假设我有一些完全适合我的ldpi设备的图像按钮。使用Draw 9-patch工具(android SDK的一部分),我可以标记可缩放区域,并且该图像非常适合hdpi甚至xhdpi设备。边缘会很光滑。 但这真的是很好的实

  • 问题内容: Angular应用使用属性而不是事件。 为什么是这样? 问题答案: ng-click包含一个角度表达式。Angular表达式是在Angular 范围的上下文中求值的,该范围绑定到具有ng- click属性的元素或该元素的祖先。 Angular表达式语言不包含流控制语句,也不能声明变量或定义函数。这些限制意味着模板只能访问由控制器或指令提供的变量和运行功能。

  • 以我的拙见,关于“什么是单子”这个著名问题的答案,尤其是投票最多的答案,试图解释什么是单子,而没有明确解释为什么单子是真正必要的。它们能被解释为一个问题的解决方案吗?