Java可重入锁的实现原理与应用场景

作者:李灿辉 时间:2023-03-27 20:21:54 

可重入锁,从字面来理解,就是可以重复进入的锁。

可重入锁,也叫做递归锁,指的是同一线程外层函数获得锁之后,内层递归函数仍然有获取该锁的代码,但不受影响。

在JAVA环境下ReentrantLocksynchronized都是可重入锁。

synchronized是一个可重入锁。在一个类中,如果synchronized方法1调用了synchronized方法2,方法2是可以正常执行的,这说明synchronized是可重入锁。否则,在执行方法2想获取锁的时候,该锁已经在执行方法1时获取了,那么方法2将永远得不到执行。

可重入锁在什么场景使用呢?

可重入锁主要用在线程需要多次进入临界区代码时,需要使用可重入锁。具体的例子,比如上文中提到的一个synchronized方法需要调用另一个synchronized方法时。

可重入锁的实现原理是怎么样的?

加锁时,需要判断锁是否已经被获取。如果已经被获取,则判断获取锁的线程是否是当前线程。如果是当前线程,则给获取次数加1。如果不是当前线程,则需要等待。

释放锁时,需要给锁的获取次数减1,然后判断,次数是否为0了。如果次数为0了,则需要调用锁的唤醒方法,让锁上阻塞的其他线程得到执行的机会。

下面是一个用synchronized实现的例子:


public class ReentrantTest implements Runnable {
 public synchronized void get() {
   System.out.println(Thread.currentThread().getName());
   set();
 }
 public synchronized void set() {
   System.out.println(Thread.currentThread().getName());
 }
 public void run() {
   get();
 }
 public static void main(String[] args) {
   ReentrantTest rt = new ReentrantTest();
   for(;;){
     new Thread(rt).start();
   }
 }
}

整个过程没有发生死锁的情况,截取一部分输出结果如下:

Thread-8492
Thread-8492
Thread-8494
Thread-8494
Thread-8495
Thread-8495
Thread-8493
Thread-8493

set()get()同时输出了线程名称,表明即使递归使用synchronized也没有发生死锁,证明其是可重入的。

来源:https://blog.csdn.net/li_canhui/article/details/84556412

标签:java,可重入锁
0
投稿

猜你喜欢

  • SpringBoot向容器注册bean的方法详解

    2023-09-02 10:58:22
  • 浅析java 归并排序算法

    2022-01-20 09:59:50
  • JAVA回顾:封装,继承,多态

    2021-09-26 20:17:59
  • WinForm中KeyDown,KeyPress和KeyUp的顺序与区别解析

    2023-06-30 22:34:36
  • Spring在SingleTon模式下的线程安全详解

    2021-10-08 11:39:31
  • Android原生视频播放VideoView的使用

    2022-10-13 08:33:07
  • SpringBoot实用小技巧之如何动态设置日志级别

    2023-02-09 04:27:58
  • 美化java代码,从合理注释开始

    2022-01-18 16:32:47
  • Unity的IPostBuildPlayerScriptDLLs实用案例深入解析

    2022-12-23 00:12:38
  • 百度人脸识别之人脸识别FaceIdentify(签到考勤)

    2022-08-24 18:25:03
  • C#导出网站功能实例代码讲解

    2023-09-15 03:15:36
  • 代理模式:JAVA静态代理和动态代理的实例和实现详解

    2023-06-05 02:19:27
  • java 二进制数据与16进制字符串相互转化方法

    2023-04-24 15:57:00
  • Java解除文件占用即Dom4j操作后实现xml关流

    2022-07-05 19:18:35
  • springboot2.x整合tkmapper的示例代码

    2021-09-19 11:56:59
  • Mybatis映射文件规则实例详解

    2022-04-22 03:08:14
  • Android倒计时的开始与停止 剩余时分秒的展示

    2023-07-20 03:11:31
  • Spring Security和Shiro的相同点与不同点整理

    2023-01-15 17:07:20
  • Spring Boot + thymeleaf 实现文件上传下载功能

    2022-05-22 03:56:13
  • Android 控制wifi 相关操作实例

    2023-09-08 20:35:49
  • asp之家 软件编程 m.aspxhome.com