面试:什么是可重入性?为什么 synchronized 是可重入锁?

一、什么是可重入性

可重入锁,就是同一个线程在外层方法获取锁之后,再次进入该锁的内层同步代码时,可以直接再次获取锁,不会被自己阻塞。
简单说:自己加的锁,自己可以重复进,不会死锁自己。

二、为什么说 synchronized 是可重入锁

因为 synchronized 底层是基于 Monitor 监视器 + 锁计数器 实现的:

线程第一次获取锁时,计数器置为 1

同一线程再次进入同步代码时,计数器 +1

每退出一层同步代码,计数器 -1

计数器为 0 时,才真正释放锁

所以同一个线程可以重复获取同一把锁,不会产生死锁,因此 synchronized 是可重入锁。

用代码举个例子就是:

复制代码
public class Test {
    public synchronized void a() {
        b(); // 同一线程,再次进入 synchronized
    }

    public synchronized void b() {
        // ...
    }
}

调用 a() 时线程已经获取锁,再调用 b() 不会阻塞,这就是可重入。

顺便记一个加分点:
ReentrantLock 也是可重入锁,原理一样,靠 AQS 里的 state 计数器实现。
不可重入锁会导致:自己锁自己 → 死锁。

而对于这种不可重入锁最通用的解决办法就是使用可重入锁,通过记录锁持有线程和计数器,避免同一线程重复加锁时被阻塞。

相关推荐
@insist12311 分钟前
信息安全工程师-密码学专题(下):构建可信网络空间的核心机制
java·大数据·密码学·软考·信息安全工程师·软件水平考试
摇滚侠20 分钟前
Java 零基础全套视频教程,面向对象(高级),笔记 105-120
java·开发语言·笔记
dfdfadffa22 分钟前
SQL窗口函数如何优化嵌套子查询_提升执行效率
jvm·数据库·python
前端那点事22 分钟前
Vue批量文件上传并发踩坑指南:3步解决阻塞、限流、进度混乱
前端·面试
叶落阁主28 分钟前
Spring Boot 4 实战:Jackson 2.x 升级到 3.x 踩坑全记录
java·后端·架构
布吉岛的石头28 分钟前
Java 中高级面试:JVM 内存模型 + GC 算法高频题总结
java·jvm·面试
m0_5887584841 分钟前
如何查看集群版本_crsctl query crs activeversion当前版本
jvm·数据库·python
2301_792674861 小时前
java学习(day32)
java
摇滚侠1 小时前
Oracle19c 导出 Oracle11g 导入,Oracle19c 导出导入,Oracle11g 导出导入
java·数据库·oracle
zh1570231 小时前
CSS如何让元素出现时带抖动_利用关键帧定义抖动动画
jvm·数据库·python