当前位置: 首页 > 面试题库 >

Java中的“ ReentrantLock”是什么意思?

宇文修文
2023-03-14
问题内容

重入意味着锁定是在每个线程而不是每个调用的基础上获得的。

由于内在锁由线程持有,这是否意味着线程运行一次等于调用基础?

谢谢,这似乎意味着:在线程中,如果我lockAdoA调用function的流程函数时获得了锁doB,并且doB还需要一个锁lockA,那么将会有一个可重入的过程。在Java中,这种现象是按线程获取的,因此我不需要考虑死锁吗?


问题答案:

重入意味着锁定是在每个线程而不是每个调用的基础上获得的。

这是一个误导性的定义。这是真的(有点),但它没有切中要害。

可重入意味着(通常使用CS / IT术语)您正在做某事,而当您仍在做时,您又在做一次。对于锁,这意味着您 在单个线程上执行以下操作

  1. 获取“ foo”的锁定。
  2. 做一点事
  3. 获取“ foo”的锁定。请注意,我们尚未释放先前获得的锁。
  4. 释放对“ foo”的锁定
  5. 释放对“ foo”的锁定

使用可重入锁/锁定机制,获取相同锁的尝试将成功,并将增加属于该锁的内部计数器。仅当锁的当前持有者两次释放锁时,锁才会释放。

这是Java中使用原始对象锁/监视器的示例,它们是可重入的:

Object lock = new Object();
...
synchronized (lock) {
    ...
    doSomething(lock, ...)
    ...
}

public void doSomething(Object lock, ...) {
    synchronized (lock) {
        ...
    }
}

可重入锁的替代方法是不可重入锁,在这种情况下,线程尝试获取已持有的锁将是一个错误。

使用可重入锁的优势在于,您不必担心由于意外获取已经持有的锁而导致失败的可能性。不利的一面是,您不能假设调用的内容不会改变锁旨在保护的变量的状态。但是,通常这不是问题。锁通常用于防止
其他 线程进行的并发状态更改。

所以我不用考虑僵局了吗?

是的你是。

线程不会对自己死锁(如果锁是可重入的)。但是,如果还有其他线程可能在尝试锁定的对象上具有锁定,则可能会出现死锁。



 类似资料:
  • 问题内容: 我发现此代码可在此处找到SO中的重复项。但我不明白这条线是什么意思 问题答案: 该运算符是Java中无符号的右移位运算符。它有效地将操作数除以右操作数的幂,或者仅在此处。 和之间的差异仅在移动负数时才会显示。如果运算符是a ,则运算符会将其移位到最高有效位,而无论如何都将移位。 更新: 让我们求平均值和()。我们可以轻松地进行数学运算: 现在,通过代码,涉及到以下这些位: 让我们将“转

  • 问题内容: 我已经看到了声明,接口和类 这是什么意思? 问题答案: 没有证据,我相信您在谈论Java的泛型支持… 泛型允许您抽象类型 在Java 5之前,很难提供能够支持多种不同类型的Objects的类而不必为每种特定情况编写代码,因此人们通常会这样做。 这导致在运行时做出许多困难的选择,您必须进行运行时检查以查看是否有可能将给定的Object强制转换为可用类型…例如 现在,这已经很明显了,但是如

  • 在这组Java代码中,处的是什么意思?我试着搜索,但我没有找到任何解释。请知道的人给我解释一下。太感谢你了。

  • 我发现这段代码是为了在SO post中找到重复的代码。但我不明白这行是什么意思

  • 问题内容: 作为Java的初学者,我仍然不确定它的含义。有人精通Java 问题答案: 静态表示标记为此类的变量或方法在类级别可用。换句话说,你无需创建类的实例即可访问它。 因此,与其创建一个Foo实例,然后doStuff像这样调用: 你只需直接针对该类调用该方法,如下所示: