讲师中心 微信公众号
AI工具推荐 视频效率加速

Java面试之synchronized与Lock的区别

星丽小哥_6834

星丽小哥_6834

发布时间:2026-01-04 09:09:10

|

744人浏览过

|

来源于php中文网

原创

synchronized不能中断等待线程,因其底层monitor不响应interrupt信号;而ReentrantLock的lockInterruptibly()可响应中断并抛出InterruptedException。

java面试之synchronized与lock的区别

为什么 synchronized 不能中断等待线程

synchronized 是 JVM 层的内置锁,进入阻塞状态后线程会挂起,且无法被 Thread.interrupt() 中断。这是由底层 monitor 实现决定的——它不响应中断信号,只会一直等锁释放。

而 Lock 接口(如 ReentrantLock)提供了 lockInterruptibly() 方法,调用时若线程被中断,会抛出 InterruptedException 并立即退出等待队列。

  • 使用 synchronized 时,即使调用 thread.interrupt(),线程仍卡在 monitorenter 指令上,无法响应
  • ReentrantLock.lockInterruptibly() 在获取锁前会检查中断状态,适合需要超时或可取消的场景(如任务调度、RPC 调用)
  • 注意:lockInterruptibly() 不是“自动中断”,必须配合外部中断逻辑(比如另一个线程调用 interrupt())

tryLock() 和 wait/notify 不能混用

synchronized 块内可以安全使用 Object.wait() / notify(),因为它们绑定的是同一个 monitor 对象;但 Lock 不提供原生的等待/唤醒机制,必须搭配 Condition 使用。

直接在 ReentrantLock 保护的代码里调用 wait() 会抛 IllegalMonitorStateException,因为此时线程并未持有该对象的 monitor 锁。

立即学习“Java免费学习笔记(深入)”;

Alibabacloud Sdk Client Initialization For Java
Alibabacloud Sdk Client Initialization For Java

在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。

下载
  • synchronized(obj) { obj.wait(); } 合法,obj 就是 monitor
  • lock.lock(); obj.wait(); 非法,obj 和锁无关
  • 正确方式是:Condition condition = lock.newCondition(); condition.await(); condition.signal();
  • 一个 Lock 可创建多个 Condition,实现更精细的等待队列(比如读写锁中分别管理读等待和写等待)

公平性与性能差异在哪体现

synchronized 始终是非公平的,且无法配置;ReentrantLock 默认也是非公平,但构造时传 true 可启用公平模式:new ReentrantLock(true)。

公平锁会按线程入队顺序分配锁,避免饥饿,但吞吐量明显下降——每次加锁都要遍历同步队列确认头节点,还可能引发频繁的线程挂起/唤醒切换。

  • 高并发争抢下,非公平锁平均性能比公平锁高 2–3 倍(JDK8 测试数据)
  • synchronized 经过 JIT 优化后,在无竞争或轻度竞争时几乎无额外开销;而 ReentrantLock 即使未争抢,也有对象创建和方法调用成本
  • 公平锁只应在明确存在饥饿风险(如定时任务线程长期拿不到锁)时启用,不是“更安全”的默认选项

锁升级失败会导致 synchronized 退化为重量级锁

JVM 对 synchronized 做了多层优化:偏向锁 → 轻量级锁 → 重量级锁。一旦发生锁竞争(比如两个线程同时进入同一把锁),偏向锁会被撤销,后续再进入就会直接走轻量级锁路径;若自旋失败(默认 10 次),就膨胀为重量级锁,线程进入操作系统 Mutex 等待。

这个过程不可逆,且撤销偏向锁需全局安全点(stop-the-world),可能造成明显停顿。

  • ReentrantLock 没有这种“锁升级”概念,始终基于 AQS 队列,行为稳定可预期
  • 可通过 JVM 参数关闭偏向锁(-XX:-UseBiasedLocking)来规避撤销开销,尤其在容器环境或短生命周期应用中
  • 注意:JDK15+ 默认禁用偏向锁,JDK17 彻底移除,所以新项目基本不用考虑这部分复杂性
public class LockVsSyncExample {
    private final Object syncObj = new Object();
    private final ReentrantLock lock = new ReentrantLock();

    public void syncMethod() {
        synchronized (syncObj) {
            // 正确:wait 必须在 synchronized 块中
            try {
                syncObj.wait(100);
            } catch (InterruptedException e) {
                Thread.currentThread().interrupt();
            }
        }
    }

    public void lockMethod() {
        lock.lock();
        try {
            // 错误:不能在这里调用 wait()
            // syncObj.wait(); // 抛 IllegalMonitorStateException

            // 正确:用 Condition
            Condition condition = lock.newCondition();
            condition.await(100, TimeUnit.MILLISECONDS);
        } catch (InterruptedException e) {
            Thread.currentThread().interrupt();
        } finally {
            lock.unlock();
        }
    }
}
锁的语义一致性比语法糖更重要。很多人以为 ReentrantLock 就是 synchronized 的升级版,其实它们适用边界很不同:前者适合需要中断、超时、多条件等待的显式控制场景;后者在大多数简单同步需求中更轻量、更不易出错。真正容易被忽略的是——synchronized 的 monitor 本质决定了它和 JVM 内存模型、GC 安全点、逃逸分析深度耦合,而这些细节在调试死锁或性能抖动时才突然变得关键。

热门AI工具

更多
DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

Laper
Laper Hot

Laper是专为编剧、导演和制片人推出的 AI 原生剧本创作工具。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

Seko
Seko Hot

一款AI视频创作工具,主要用于商汤科技推出的创编一体的AI短视频创作Agent,适合需要提升相关任务效率的用户。

LibLibAI
LibLibAI Hot

一款AI视频创作工具,主要用于国内领先的AI创意平台,以海量模型、低门槛操作与“创作-分享-商业化”生态,让小白与专业创作者都能高效实现图文乃至视频创意表达,适合需要提升相关任务效率的用户。

Loomy
Loomy Hot

一款AI工具,主要用于科大讯飞发布的桌面级 AI 助理,比 OpenClaw 更易用、更安全!,适合需要提升相关任务效率的用户。

UP简历
UP简历 Hot

一款AI办公效率工具,主要用于基于AI技术的免费在线简历制作工具,适合需要提升相关任务效率的用户。

音述AI
音述AI Hot

一款AI音频处理工具,主要用于音述AI是一个以“用声音述说故事”为核心的 AI 音乐创作与声音分享社区,适合需要提升相关任务效率的用户。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

相关专题

更多
硬盘接口类型介绍
硬盘接口类型介绍

硬盘接口类型有IDE、SATA、SCSI、Fibre Channel、USB、eSATA、mSATA、PCIe等等。详细介绍:1、IDE接口是一种并行接口,主要用于连接硬盘和光驱等设备,它主要有两种类型:ATA和ATAPI,IDE接口已经逐渐被SATA接口;2、SATA接口是一种串行接口,相较于IDE接口,它具有更高的传输速度、更低的功耗和更小的体积;3、SCSI接口等等。

3048

2023.10.19

PHP接口编写教程
PHP接口编写教程

本专题整合了PHP接口编写教程,阅读专题下面的文章了解更多详细内容。

4329

2025.10.17

php8.4实现接口限流的教程
php8.4实现接口限流的教程

PHP8.4本身不内置限流功能,需借助Redis(令牌桶)或Swoole(漏桶)实现;文件锁因I/O瓶颈、无跨机共享、秒级精度等缺陷不适用高并发场景。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

3689

2025.12.29

java接口相关教程
java接口相关教程

本专题整合了java接口相关内容,阅读专题下面的文章了解更多详细内容。

386

2026.01.19

线程和进程的区别
线程和进程的区别

线程和进程的区别:线程是进程的一部分,用于实现并发和并行操作,而线程共享进程的资源,通信更方便快捷,切换开销较小。本专题为大家提供线程和进程区别相关的各种文章、以及下载和课程。

3578

2023.08.10

Java 并发编程高级实践
Java 并发编程高级实践

本专题深入讲解 Java 在高并发开发中的核心技术,涵盖线程模型、Thread 与 Runnable、Lock 与 synchronized、原子类、并发容器、线程池(Executor 框架)、阻塞队列、并发工具类(CountDownLatch、Semaphore)、以及高并发系统设计中的关键策略。通过实战案例帮助学习者全面掌握构建高性能并发应用的工程能力。

523

2025.12.01

Buffalo框架数据库开发全教程
Buffalo框架数据库开发全教程

本专题围绕Buffalo框架数据库开发,讲解database.yml多环境配置、soda与fizz迁移生成回滚、模型结构体标签、增删改查与条件查询、一对多与多对多关联、数据校验、回调钩子、事务处理及原生SQL执行能力。

160

2026.09.23

Buffalo框架路由与请求处理实操指南
Buffalo框架路由与请求处理实操指南

本专题讲解Buffalo框架路由与请求处理机制,涵盖路由注册与分组、资源路由、Handler编写规范、Context上下文方法、参数绑定、中间件编写挂载、Session与Cookie读写、Flash消息及错误页面定制方法。

80

2026.09.23

Buffalo框架零基础入门教程
Buffalo框架零基础入门教程

本专题整理Buffalo框架入门内容,涵盖Go环境准备、buffalo CLI安装、新项目生成、目录结构说明、dev热加载启动、数据库连接配置与常见报错排查,帮助新手按约定优于配置的思路跑通第一个Buffalo框架应用。

80

2026.09.23

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
dev.java 官方:Learn Java
dev.java 官方:Learn Java

共0课时 | 0人学习

Java JDBC数据库连接官方教程
Java JDBC数据库连接官方教程

共0课时 | 0人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn