关于java:并发王者课铂金03一劳永逸如何理解锁的可重入问题

35次阅读

共计 1869 个字符,预计需要花费 5 分钟才能阅读完成。

欢送来到《并发王者课》,本文是该系列文章中的 第 16 篇

在后面的文章《铂金 1:探本溯源 - 为何说 Lock 接口是 Java 中锁的根底》中,咱们提到了锁的可重入问题,并作了简略介绍。鉴于锁的可重入是一个重要概念,所以本文把拿进去做一次独自解说,以帮忙你彻底了解它。

一、锁的可重入所造成的问题

首先,咱们通过一段示例代码看锁的可重入是如何导致问题产生,以了解它的重要性。

public class ReentrantWildArea {
    // 野区锁定
    private boolean isAreaLocked = false;

    // 进入野区 A
    public synchronized void enterAreaA() throws InterruptedException {
        isAreaLocked = true;
        System.out.println("曾经进入野区 A...");
        enterAreaB();}
    // 进入野区 B
    public synchronized void enterAreaB() throws InterruptedException {while (isAreaLocked) {System.out.println("野区 B 办法进入期待中...");
            wait();}
        System.out.println("曾经进入野区 B...");
    }

    public synchronized void unlock() {
        isAreaLocked = false;
        notify();}
}

在下面这段代码中,咱们创立了一片野区,蕴含了 野区 A 野区 B 。接着,咱们再创立一个 打野英雄铠,让他进去野区打野,看看会产生什么事件。

public static void main(String[] args) {
  // 打野英雄铠进入野区
  Thread kaiThread = new Thread(() -> {ReentrantWildArea wildArea = new ReentrantWildArea();
    try {wildArea.enterAreaA();
    } catch (InterruptedException e) {e.printStackTrace();
    }
  });
  kaiThread.start();}

输入后果如下:

曾经进入野区 A...
野区 B 办法进入期待中...

从后果中能够看到,尽管在同一块野区,然而铠只进入野区 A,却没能进入野区 B,被阻塞在半道上了。从代码剖析上看,野区的两个办法都申明了synchronized,但铠在进入野区 A 之后,野区进行了锁定isAreaLocked = true,导致铠进入野区 B 时失败。

这就是典型的锁的可重入所造成的问题。在并发编程时,如果未能解决好这一问题,将会造成线程的有限阻塞,其结果和死锁相当

二、了解锁的可重入

所谓锁的可重入,指的是锁能够被线程 反复 递归 调用,也能够了解为对同一把锁的反复获取。如果未能解决好锁的可重入问题,将会导致和死锁相似的问题。

三、如何防止锁的可重入问题

防止锁的可重入问题,须要留神两个方面:

  • 尽量避免编写须要重入获取锁的代码
  • 如果须要,应用可重入锁

在 Java 中,synchronized是能够重入的,上面的这段代码在调用时不会产生重入问题。

public class WildMonster {public synchronized void A() {B();
    }
    
    public synchronized void B() {doSomething...}
}

然而,基于 Lock 接口所实现的各种锁并不总是反对可重入的 。在后面的文章中,咱们曾经展现过不反对重入的 Lock 接口实现。在具体的场景中应用时,须要务必留神这点。如果须要可重入锁,能够应用 Java 中的ReentrantLock 类。

小结

在本文中,咱们再次介绍了锁的可重入问题,并介绍了其产生的起因及防止形式。Java 中的 synchronized 关键字反对锁的可重入,然而其余显示锁并非总是反对这一个性,在应用时须要留神。

此外,须要留神的是,锁的可重入对锁的性能有肯定的影响,而且实现起来更为简单。所以,咱们不能说锁的可重入与不可重入哪个好,这要取决于具体的问题

注释到此结束,祝贺你又上了一颗星✨

夫子的试炼

  • 查看 ReentrantLock 源码,理解其反对可重入的原理。

延长浏览与参考资料

  • 《并发王者课》纲要与更新进度总览

对于作者

关注公众号【技术八点半】,及时获取文章更新。传递有品质的技术文章,记录平凡人的成长故事,偶然也聊聊生存和现实。晚上 8:30 推送作者品质原创,早晨 20:30 推送行业深度好文。

如果本文对你有帮忙,欢送 点赞 关注 监督 ,咱们一起 从青铜到王者

正文完
 0