点击上方java大数据修炼之道”,选择“置顶或者星标”

技术文章第一时间送达!

Java不可重入锁和可重入锁理解

最近正在阅读Java ReentrantLock源码,始终对可重入和不可重入概念理解不透彻,进行学习后记录在这里。

基础知识

Java多线程的wait()方法和notify()方法

这两个方法是成对出现和使用的,要执行这两个方法,有一个前提就是,当前线程必须获其对象的monitor(俗称“锁”),否则会抛出IllegalMonitorStateException异常,所以这两个方法必须在同步块代码里面调用。

wait():阻塞当前线程

notify():唤起被wait()阻塞的线程

不可重入锁

所谓不可重入锁,即若当前线程执行某个方法已经获取了该锁,那么在方法中尝试再次获取锁时,就会获取不到被阻塞。我们尝试设计一个不可重入锁:

Java不可重入锁和可重入锁理解

使用该锁:

Java不可重入锁和可重入锁理解

当前线程执行print()方法首先获取lock,接下来执行doAdd()方法就无法执行doAdd()中的逻辑,必须先释放锁。这个例子很好的说明了不可重入锁。

可重入锁

接下来,我们设计一种可重入锁

Java不可重入锁和可重入锁理解

所谓可重入,意味着线程可以进入它已经拥有的锁的同步代码块儿。

我们设计两个线程调用print()方法,第一个线程调用print()方法获取锁,进入lock()方法,由于初始lockedBy是null,所以不会进入while而挂起当前线程,而是是增量lockedCount并记录lockBy为第一个线程。接着第一个线程进入doAdd()方法,由于同一进程,所以不会进入while而挂起,接着增量lockedCount,当第二个线程尝试lock,由于isLocked=true,所以他不会获取该锁,直到第一个线程调用两次unlock()将lockCount递减为0,才将标记为isLocked设置为false。

可重入锁的概念和设计思想大体如此,Java中的可重入锁ReentrantLock设计思路也是这样

Java不可重入锁和可重入锁理解

推荐阅读:

最近干货分享

推荐学习路线:

1、Java学习求职路线(资料、视频、源码、项目实战)
2 、java项目20套 +完整版java学习视频

推荐面试技巧:

1、面试时被质疑学历、年龄怎么办?

2、如何应对面试官问你职业规划问题

3、面试的时候问:你的期望薪资多少?怎么谈?

4、面试官问,你有什么问题需要问我的吗?

5、给培训出来的Java程序员的一点建议,教你如何找工作

推荐阅读:

  

长按订阅更多精彩▼助推你成长

Java不可重入锁和可重入锁理解

识别二维码,关注我

Java不可重入锁和可重入锁理解

看完本文有收获? 请转发分享给更多人

相关文章:

  • 2022-12-23
  • 2021-07-26
  • 2021-05-22
  • 2021-11-08
  • 2022-12-23
  • 2021-04-24
  • 2021-07-16
猜你喜欢
  • 2022-03-03
  • 2022-12-23
  • 2021-07-04
  • 2021-12-23
相关资源
相似解决方案