可重入锁

简介: 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/内存编译器 )
212 6
|
Java 应用服务中间件 编译器
详解JAVA远程debug
详解JAVA远程debug
497 0
|
6月前
|
Arthas 监控 Java
Arthas thread(查看当前JVM的线程堆栈信息)
Arthas thread(查看当前JVM的线程堆栈信息)
1126 10
|
11月前
|
供应链 搜索推荐 数据挖掘
跨境电商圣诞节选品大揭秘:看板如何帮助提升选品效率?
本文探讨了跨境电商在圣诞期间的选品策略,涵盖利用大数据平台、社交媒体监测、竞争对手分析及行业趋势研究等方法。同时介绍了选品流程优化及板栗看板在选品工作中的应用,帮助卖家精准选品,提升销售业绩。
跨境电商圣诞节选品大揭秘:看板如何帮助提升选品效率?
|
11月前
|
人工智能 JSON Linux
利用阿里云GPU加速服务器实现pdf转换为markdown格式
随着AI模型的发展,GPU需求日益增长,尤其是个人学习和研究。直接购置硬件成本高且更新快,建议选择阿里云等提供的GPU加速型服务器。
利用阿里云GPU加速服务器实现pdf转换为markdown格式
|
安全 Java 数据处理
Java Consumer 接口详解
在Java编程中,有时需要对某个对象进行操作或者处理,而这个操作可能是非常灵活的。Java 8引入了函数式编程的特性,其中的一个重要接口就是Consumer接口。本文将详细介绍Consumer接口,包括它的定义、用法以及示例。
622 0
|
设计模式 XML Java
Spring的生命周期及Spring Bean单例和多例---超详细教学
Spring的生命周期及Spring Bean单例和多例---超详细教学
1253 0
|
Dart 开发者 UED
flutter 非常用组件整理 第三篇
本文是非常用组件的第三讲,介绍了一些不为人知但却能大幅提升Flutter应用UI效果和功能的高级组件,包括FadeInImage、GridPaper、Hero等,为开发者带来更丰富的UI设计可能。
303 3
flutter 非常用组件整理 第三篇
|
SQL 监控 Java
Java Web应用中数据库连接池的配置与优化
Java Web应用中数据库连接池的配置与优化
785 1
|
Java BI 调度
Springboot项目中定时任务的四种实现方式
Springboot项目中定时任务的四种实现方式
1888 4

热门文章

最新文章