news 2026/8/28 6:29:35

深度理解 Java synchronized —— 从原理到实战

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
深度理解 Java synchronized —— 从原理到实战


文章目录

  • 一、synchronized 的作用
      • `synchronized` 解决两个问题:
  • 二、synchronized 的三种使用方式
    • ✔ 1. 修饰实例方法(锁 —— 当前对象 this)
    • ✔2. 修饰静态方法(锁 —— 当前类的 Class 对象)
    • ✔3. 修饰代码块(锁 —— 任意对象)
  • 三、synchronized 的底层原理(Monitor 机制)
    • ✔1. synchronized 基于对象监视器(Monitor)实现
  • 四、锁的升级过程(JDK 6 后重要优化)
  • 五、可见性是如何保证的?
  • 六、synchronized 与 Reentrant(可重入性)
  • 七、synchronized 与 volatile 的区别(面试高频)
  • 八、synchronized 的优缺点
  • 九、synchronized VS Lock(面试必考)
  • 十、实战

一、synchronized 的作用

synchronized是 Java 提供的最基础、最核心的线程同步机制,用来保证多线程环境下的互斥访问可见性
虽然简单易用,但其背后的锁原理(Monitor)、对象头(Mark Word)、锁升级(偏向锁→轻量级锁→重量级锁)等概念极其重要,也是面试高频考点。

synchronized解决两个问题:

  1. 互斥性(Mutual Exclusion)
    保证同一时刻只有一个线程可以执行临界区代码。
  2. 可见性(Visibility)
    保证释放锁前对共享变量的修改对下一个获得锁的线程可见(类似 volatile 的效果)。

二、synchronized 的三种使用方式

✔ 1. 修饰实例方法(锁 —— 当前对象 this)

publicsynchronizedvoidtest(){// 临界区}

等价于:

publicvoidtest(){synchronized(this){// 临界区}}

特点:

  • 作用于:同一个对象实例
  • 多个线程访问不同对象时不会互斥

✔2. 修饰静态方法(锁 —— 当前类的 Class 对象)

publicstaticsynchronizedvoidtest(){// 临界区}

等价于:

synchronized(MyClass.class){// 临界区}

特点:

  • 锁住的是类对象,所有实例共享一把锁

✔3. 修饰代码块(锁 —— 任意对象)

Objectlock=newObject();synchronized(lock){// 临界区}

特点:

  • 最灵活
  • 推荐在实际开发中优先使用
  • 可以对任何对象加锁(Object、String 等)

三、synchronized 的底层原理(Monitor 机制)

✔1. synchronized 基于对象监视器(Monitor)实现

Java 中,每一个对象都可以作为锁,因为:

  • 每个对象在 JVM 中都有一个对象头(Object Header)
  • 对象头中包含锁状态(Mark Word)
  • synchronized 通过 Monitor(监视器锁)实现互斥

四、锁的升级过程(JDK 6 后重要优化)

Java 的锁不是一开始就用重量级锁,而是逐步升级,以提升性能。

锁类型特点适用场景
无锁无竞争单线程
偏向锁无需 CAS,完全无竞争同一线程反复进入
轻量级锁使用 CAS,自旋少量竞争
重量级锁阻塞/唤醒,最慢竞争激烈

⚠️注意事项:

  • 锁只能从低级到高级升级
  • 不会降级(重要)

五、可见性是如何保证的?

当一个线程释放锁时,JVM 会做两件事:

  1. 把工作内存的变量刷新到主内存(释放锁 → 写回)
  2. 获得锁的线程会从主内存重新读取变量

因此保证:

  • 前一个线程修改的数据对后一个线程可见

六、synchronized 与 Reentrant(可重入性)

synchronized可重入锁
同一线程可以多次获得同一把锁不会死锁。

publicsynchronizedvoida(){b();// 可以再次获得同一把锁}publicsynchronizedvoidb(){// ...}

七、synchronized 与 volatile 的区别(面试高频)

对比synchronizedvolatile
可见性
原子性有(加锁)没有
是否阻塞会阻塞不阻塞
用途多个操作的原子性单变量读写
底层Monitor、锁升级内存屏障、禁止指令重排

volatile 解决可见性,synchronized 解决原子性 + 可见性。


八、synchronized 的优缺点

✔优点

  • 语法简单
  • JVM 层面保证,没有死锁风险(可重入)
  • 经过大量优化(锁消除、偏向锁)性能已大幅提升

✔缺点

  • 粒度不够灵活(无条件等待)
  • 性能比 Lock 略弱(尤其在高并发中)
  • 无法进行尝试锁 / 中断锁 / 超时锁 等操作

九、synchronized VS Lock(面试必考)

特性synchronizedLock
锁的释放自动释放必须 unlock()
可中断
可尝试✔(tryLock)
公平锁
条件队列✔(Condition)
性能被优化后差别不大更灵活,高并发优势明显

十、实战

建议 1:优先使用 synchronized(JDK 8 性能已非常好)
建议 2:优先锁代码块,而不是锁整个方法
建议 3:锁对象要私有,避免被外部使用

privatefinalObjectlock=newObject();

建议 4:避免锁住字符串常量(共享跨 ClassLoader)

synchronized("LOCK"){}// ❌ 千万不要这样写


参考资料

深入理解Java中synchronized三种使用方式:助您写出线程安全的代码-知乎

synchronized - 指南 - ljbguanli - 博客园

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/8/28 13:34:06

企业微信Linux客户端开发效率提升300%的秘诀

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容: 开发一个企业微信Linux客户端的高效开发辅助工具,包含:1. 自动生成常用API调用代码片段 2. 实时语法检查和自动修复 3. 请求/响应数据模拟器 4. 性能分析工具…

作者头像 李华
网站建设 2026/8/28 0:32:19

传统VS现代:WiFi密码字典生成效率对比

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容: 开发一个性能对比工具,分别实现传统暴力生成和AI智能生成两种WiFi密码字典生成方式。要求统计并对比两者的生成速度、字典有效性和资源占用情况。使用Python实现&#x…

作者头像 李华
网站建设 2026/8/27 15:37:04

KMP OpenHarmony 农产品价格预测分析器

文章概述 农产品价格波动直接影响农民的收入和消费者的生活成本。农产品价格预测分析器通过综合分析历史价格数据、市场供求关系、季节性因素、政策影响等多个因素,科学预测农产品的价格走势,帮助农民、商人和消费者做出更明智的决策。准确的价格预测可以…

作者头像 李华
网站建设 2026/8/28 13:36:27

2025降重工具大横评:快降重网实测,如何从40%降到5%?

深夜的实验室,李同学电脑屏幕上同时打开了五六个降重网站,屏幕光映着他紧皱的眉头。一篇查重率40%、AI痕迹明显的论文,究竟该用哪个工具才能快速“洗白”?距离毕业论文提交截止只剩48小时,李同学面临着所有毕业生都头疼…

作者头像 李华
网站建设 2026/8/25 12:30:05

基于CNN的图像识别垃圾分类系统开题报告

一、课题研究背景与意义1.1 研究背景 随着我国城市化进程的加速,城市生活垃圾产生量逐年攀升,2024年全国城市生活垃圾清运量已突破3.5亿吨。传统垃圾分类依赖人工分拣,存在效率低、成本高、分类准确率差等问题,难以满足“减量化、…

作者头像 李华
网站建设 2026/8/27 13:57:50

基于SpringBoot+Vue的家政平台管理系统开题报告

本篇仅仅开题案例,非源码,有任何困难和问题都可以末尾卡片和博主交流!基于SpringBootVue的家政平台管理系统开题报告 一、课题研究背景与意义1.1 研究背景 随着我国居民生活水平的提升和人口老龄化程度的加深,家政服务需求呈现爆发…

作者头像 李华