可重入锁

简介: JUC学习
  • 什么是可重入,可重入锁?


可重入:(来源于维基百科)若一个程序或子程序可以“在任意时刻被中断然后操作系统调度执行另外一段代码,这段代码又调用了该子程序不会出错”,则称其为可重入(reentrant或re-entrant)的。即当该子程序正在运行时,执行线程可以再次进入并执行它,仍然获得符合设计时预期的结果。与多线程并发执行的线程安全不同,可重入强调对单个线程执行时重新进入同一个子程序仍然是安全的。

可重入锁:又名递归锁,是指在同一个线程在外层方法获取锁的时候,再进入该线程的内层方法会自动获取锁(前提锁对象得是同一个对象或者class),不会因为之前已经获取过还没释放而阻塞。以线程为单位,当一个线程获取对象锁之后,这个线程可以再次获取本对象上的锁,而其他的线程是不可以的

示例:

public class SynchronizedDemo {
    public static void main(String[] args) {
        SynchronizedDemo demo =  new SynchronizedDemo();
        demo.method1();
    }
    private synchronized void method1() {
        System.out.println(Thread.currentThread().getId() + ": method1()");
        method2();
    }
    private synchronized void method2() {
        System.out.println(Thread.currentThread().getId()+ ": method2()");
        method3();
    }
    private synchronized void method3() {
        System.out.println(Thread.currentThread().getId()+ ": method3()");
    }
}

结合前文中加锁和释放锁的原理,不难理解:

  • 执行monitorenter获取锁
  • (monitor计数器=0,可获取锁)
  • 执行method1()方法,monitor计数器+1 -> 1 (获取到锁)
  • 执行method2()方法,monitor计数器+1 -> 2
  • 执行method3()方法,monitor计数器+1 -> 3
  • 执行monitorexit命令
  • method3()方法执行完,monitor计数器-1 -> 2
  • method2()方法执行完,monitor计数器-1 -> 1
  • method2()方法执行完,monitor计数器-1 -> 0 (释放了锁)
  • (monitor计数器=0,锁被释放了)

这就是Synchronized的重入性,即在同一锁程中,每个对象拥有一个monitor计数器,当线程获取该对象锁后,monitor计数器就会加一,释放锁后就会将monitor计数器减一,线程不需要再次获取同一把锁。

目录
相关文章
|
6月前
|
Arthas 监控 Java
Arthas mc(Memory Compiler/内存编译器 )
Arthas mc(Memory Compiler/内存编译器 )
147 6
|
6月前
|
Arthas 监控 Java
Arthas thread(查看当前JVM的线程堆栈信息)
Arthas thread(查看当前JVM的线程堆栈信息)
962 10
|
Java 应用服务中间件 编译器
详解JAVA远程debug
详解JAVA远程debug
458 0
|
设计模式 XML Java
Spring的生命周期及Spring Bean单例和多例---超详细教学
Spring的生命周期及Spring Bean单例和多例---超详细教学
1214 0
|
11月前
|
人工智能 JSON Linux
利用阿里云GPU加速服务器实现pdf转换为markdown格式
随着AI模型的发展,GPU需求日益增长,尤其是个人学习和研究。直接购置硬件成本高且更新快,建议选择阿里云等提供的GPU加速型服务器。
利用阿里云GPU加速服务器实现pdf转换为markdown格式
|
11月前
|
供应链 搜索推荐 数据挖掘
跨境电商圣诞节选品大揭秘:看板如何帮助提升选品效率?
本文探讨了跨境电商在圣诞期间的选品策略,涵盖利用大数据平台、社交媒体监测、竞争对手分析及行业趋势研究等方法。同时介绍了选品流程优化及板栗看板在选品工作中的应用,帮助卖家精准选品,提升销售业绩。
跨境电商圣诞节选品大揭秘:看板如何帮助提升选品效率?
|
SQL 监控 Java
Java Web应用中数据库连接池的配置与优化
Java Web应用中数据库连接池的配置与优化
750 1
|
Dart 开发者 UED
flutter 非常用组件整理 第三篇
本文是非常用组件的第三讲,介绍了一些不为人知但却能大幅提升Flutter应用UI效果和功能的高级组件,包括FadeInImage、GridPaper、Hero等,为开发者带来更丰富的UI设计可能。
267 3
flutter 非常用组件整理 第三篇
|
人工智能 自然语言处理 API
深入浅出 LangChain 与智能 Agent:构建下一代 AI 助手
深入浅出 LangChain 与智能 Agent:构建下一代 AI 助手
2787 0
深入浅出 LangChain 与智能 Agent:构建下一代 AI 助手
|
Windows
目前最好用的禁止windows自动更新
目前最好用的禁止windows自动更新
45055 0
目前最好用的禁止windows自动更新
下一篇
开通oss服务