面试:什么是可重入性?为什么 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 计数器实现。
不可重入锁会导致:自己锁自己 → 死锁。

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

相关推荐
阿维的博客日记15 小时前
MultipartFile 是不是表示仅仅是一个分片?
java·后端·spring·multipartfile
程序员无隅15 小时前
Coding Agent 为什么压缩上下文后还能继续工作?上下文模块设计拆解
java·开发语言·数据库
Python+9915 小时前
Java 枚举类(Enum)详解:从基础到高级应用
java·开发语言·python
二炮手亮子15 小时前
浅记java线程池
java·开发语言
一路向北North15 小时前
Spring Security OAuth2.0(23):分布式系统授权-转发明文给微服务
java·spring·微服务
爱吃牛肉的大老虎17 小时前
rust基础之环境搭建
java·开发语言·rust
tellmewhoisi18 小时前
多版本共用redis的token有效期校验(过期重新登录)
java·redis·缓存
疯狂打码的少年18 小时前
【软件工程】结构化设计:模块独立性与耦合内聚
java·开发语言·笔记·软件工程
乐观的Terry18 小时前
3、数据库设计与领域实体
java·数据库·spring boot·spring cloud·ai编程
C++、Java和Python的菜鸟19 小时前
第4章 后端Web基础(基础知识)
java·开发语言