JAVA面试-并发篇 04-synchronized和ReentrantLock 的区别是什么

synchronized vs ReentrantLock 区别

一、核心结论

  • synchronized :JVM内置关键字,简单省心,自动加锁释放
  • ReentrantLock :JDK实现的类,功能强大灵活,手动加锁释放

二、核心区别对比表

维度 synchronized ReentrantLock
底层实现 JVM层面,基于Monitor监视器 JDK层面,基于AQS(AbstractQueuedSynchronizer)
锁类型 非公平锁(不可修改) 默认非公平,可指定为公平锁
可重入性 ✅ 支持 ✅ 支持(实现原理相同)
中断响应 ❌ 不可中断,只能一直等 ✅ 可中断等待中的线程
超时获取锁 ❌ 不支持 ✅ 支持tryLock(timeout)
条件变量 ❌ 仅支持一个wait/notify队列 ✅ 支持多个Condition条件队列
锁释放 自动释放(代码结束/异常) 必须手动在finally中释放
性能(JDK1.6+) 低竞争时更优 高竞争时更稳定
代码复杂度 极低 中等

三、关键特性图示

公平锁 vs 非公平锁

复制代码
┌───────────── 公平锁(先来先得) ─────────────┐
│ 线程1 → 线程2 → 线程3 → 线程4 → 依次获取锁   │
└─────────────────────────────────────────────┘

┌───────────── 非公平锁(插队优先) ───────────┐
│ 线程1持有锁 → 线程2、3排队 → 线程4刚好到达   │
│ 线程1释放锁 → 线程4直接插队获取锁           │
└─────────────────────────────────────────────┘

四、代码使用对比

synchronized 示例

java 复制代码
public class SyncDemo {
    private int count = 0;
    
    public synchronized void add() {
        count++; // 自动加锁,自动释放
    }
}

ReentrantLock 示例

java 复制代码
public class LockDemo {
    private int count = 0;
    private final ReentrantLock lock = new ReentrantLock();
    
    public void add() {
        lock.lock(); // 手动加锁
        try {
            count++;
        } finally {
            lock.unlock(); // 必须手动释放!
        }
    }
}

五、常见误区对照表

误区 正确结论
ReentrantLock一定比synchronized快 JDK1.6+后,低竞争时synchronized性能更好
synchronized不是可重入锁 两者都是可重入锁,实现原理类似
公平锁一定比非公平锁好 公平锁会降低吞吐量,非公平锁性能更高
ReentrantLock可以替代synchronized 简单场景优先用synchronized,更安全不易出错

六、选型建议

场景 推荐使用
简单同步场景,代码越少越好 ✅ synchronized
需要公平锁、中断、超时获取等高级功能 ✅ ReentrantLock
高并发高竞争场景 ✅ ReentrantLock
团队新手多,怕忘记释放锁 ✅ synchronized
相关推荐
懒鸟一枚2 小时前
深入理解 Linux 内存、Swap 交换分区与分页机制的关系
java·linux·数据库
我命由我123453 小时前
执行 Gradle 指令报错,无法将“grep”项识别为 cmdlet、函数、脚本文件或可运行程序的名称
android·java·java-ee·android studio·android jetpack·android-studio·android runtime
考虑考虑3 小时前
Sentinel安装
java·后端·微服务
凤凰院凶涛QAQ5 小时前
《Java版数据结构 & 集合类剖析》栈与队列:“push/pop 是栈的灵魂,offer/poll 是队列的骨架——四组 API,两种人生”
java·开发语言·数据结构
掘金_答案6 小时前
上线那天,一个 ConcurrentHashMap 差点送走我的 AI 客服——3 天排查 JVM 血泪史
java·后端·架构
猿与禅6 小时前
CosId 分布式 ID 生成器完全教程:从架构原理到生产落地
java·shardingsphere·雪花算法·分布式id·高性能·cosid·号段模式
MindUp6 小时前
企业网盘权限模型解析:多层级访问控制与审计能力选型指南
java·linux·运维
NG4776 小时前
【软件设计与体系结构】-策略设计模式
java·设计模式·软件工程
QQ骞6 小时前
【ECU-HIL 嵌入式车载软件测试学习路线和面试描述方式(1)】
学习·面试·职场和发展
坐而论道_7 小时前
兼容低版本 Android:让现代 Web 应用在旧 WebView 上稳定运行
前端·面试