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

JAVA同时发生的ReentrantLock——为什么我们想要多次获得同一个锁[重复]

高寒
2023-03-14

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

共有3个答案

郝永思
2023-03-14

考虑这个同步的例子。这同样适用于锁,但有更多的代码

synchronized int getSum() {
     return getValue() + getOtherValue();
}

synchronized int getValue() {
     return value;
}

synchronized int getOtherValue() {
     return value;
}

避免重入的唯一方法是创建每个方法的锁定和解锁版本。但是,如果您有两个实例A和B怎么办?A调用B调用A。B怎么知道不在A中调用同步方法。

景书
2023-03-14

假设在一个类中有两个方法m1和m2,它们都是同步的,m2正在调用m1。在这种情况下,如果线程a已经锁定了m1,并且不允许再次锁定,那么thresad将继续等待调用m2(因为它已经锁定了)

公良修竹
2023-03-14

考虑以下情况,您需要一组不是原子的操作,而是原子的操作。例如,您可能希望设置数组的值,但在设置时返回其当前值。(为简洁起见,尝试最终删除)。

final ReentrantLock lock = new ReentrantLock();

final Object[] objects = new Object[10]
public Object setAndReturnPrevious(int index, Object val){
   lock.lock();
      Object prev = get(index);
      set(index,val);
      return prev;
   lock.unlock();
}
public void set(int index, Object val){
    lock.lock();
         objects[index] = val;
    lock.unlock();
}
public Object get(index index){...}

如果ReentrantLock不是可重入的,您将在get(index)

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

  • 我对高级Java和可重入锁的学习相当陌生。我知道ReentrantLock有一个公平性参数,它确保将锁提供给最缺线程(与同步的内部锁不同) 但是,Reentrant也意味着同一线程可以通过递增holdcount来一次又一次地重新获取锁。如果同一个线程一直获得锁,它如何保证公平性?

  • 我的java小程序分配有问题。出于某种我无法理解的原因,每当我选中复选框时,我的所有if语句都会立即触发。程序应该更新总价,并在每次按下方框时通知用户。我们必须使用复选框,而不是单选按钮或JCheckBox,并且程序必须编写为小程序。这里是我的代码链接。

  • 问题内容: 在具有并发访问的程序中使用映射时,是否需要在函数中使用互斥体来 读取 值? 问题答案: 读者众多,没有作家可以: https://groups.google.com/d/msg/golang- nuts/HpLWnGTp-n8/hyUYmnWJqiQJ 一个作家,没有读者是可以的。(否则,地图不会太好。) 否则,如果至少有一个作家,而作家或读者至少还有一个,那么 所有 读者 和 作家都

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