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

Java中的可重入锁定

孙才捷
2023-03-14

我在学习Java中的重入锁定。需要一定的澄清这个概念,它实际上是如何工作的。下面的片段我所理解的是:

class Test{
    public synchronized a(){   
       some code;
      b();
       some code;
    }
    public synchronized b(){    
       some code;
    }

}

共有1个答案

文彭祖
2023-03-14

重入锁是允许线程在已经持有锁的情况下再次(多次)获取锁的锁。

例如,如果线程T1调用对象的A()A()方法获取对象的锁,并开始执行主体。当A的主体调用B()时,B()调用“可重入地”获取相同的锁。当B()调用返回时,A()调用仍然持有锁。只有当a()调用返回时才释放锁。

(假设,如果Java原语锁不是可重入的,那么序列T1调用A(),然后调用B()可能会死锁,或者引发异常...)

可重入锁通常使用引用计数来实现,引用计数告诉锁实现重入的深度。

另见:https://stackoverflow.com/a/16504266/139985

 类似资料:
  • 主要内容:1 什么是Java可重入锁,2 Java可重入锁的优势,3 Java可重入锁的例子1 什么是Java可重入锁 根据Sun公司的说法,Java锁是可重入的,这意味着,如果从方法中调用方法,则Java线程可以将同一把锁用于不同的同步方法。 2 Java可重入锁的优势 它避免了单线程死锁。 3 Java可重入锁的例子 让我们通过以下示例了解Java可重入锁: 在此类中,m和n是同步方法。m() 方法在内部调用n() 方法。 现在让我们在线程上调用m() 方法。在下面给出的类中,我们使

  • 为什么java可重入锁不会导致死锁?

  • 我有一个名为“H2O问题”的家庭作业,我应该实现一个名为H2OBarrier的类,它有3种方法。 HReady,氢原子(线程)就绪时称为的方法 OReady,氧原子(线程)就绪时调用的方法 makeWater,当2个氢原子和1个氧原子准备就绪时称为方法 我应该使用Java可重入锁和条件来执行此操作。 这是我目前为止的代码,我想知道我是否正确地使用了lock和unlock。 我应该在我的 makeW

  • API文档说明: 这个类的构造函数接受一个可选的公平性参数。当设置为true时,在争用状态下,锁倾向于授予对等待时间最长的线程的访问权限。 注意,锁的公平性并不能保证线程调度的公平性。因此,使用公平锁的许多线程中的一个可以连续多次获得它,而其他活动线程没有进展,并且当前没有持有锁。 我无法理解第2点: 如果一个线程连续多次获得锁,那么根据第1点,其他线程将等待更长时间,这确实意味着它们下次将获得锁

  • 主要内容:1 ReentrantLock的概述,1.1 ReentrantLock的API方法,1.2 可重入,1.3 公平与非公平,2 ReentrantLock的原理,2.1 基本结构,2.2 构造器,2.3 非公平模式加锁原理,2.4 公平模式加锁原理,2.5 解锁原理,3 ReentrantLock总结Java的ReentrantLock的源码实现,包括加锁、解锁的源码,以及公平性、重入性的实现! 1 ReentrantLock的概述 public class ReentrantLock

  • 书中解释了在上面的代码中...“因为Widget和LoggingWidget中的doSomething方法都是同步的,所以在继续之前,每个方法都试图获取小部件上的锁。” 我运行了上面的代码来观察内部锁。上面的引文似乎暗示线程在Widget对象上获得了一个内在锁,但我观察到的是线程在LoggingWidget上获得了一个锁。我不知道如何核实收购数量,所以无法观察到这一点。 这本书是可以互换地使用lo