网站首页 > java教程 正文
synchronized
在 Java 中,synchronized 是实现线程同步的核心机制,其底层原理涉及 对象头结构、Monitor 锁模型 和 锁升级优化。
一、synchronized 的作用
- 原子性:确保同一时刻只有一个线程执行同步代码。
- 可见性:线程解锁前,变量修改会强制刷入主内存;加锁时,从主内存重新加载变量。
- 有序性:通过锁限制指令重排序(遵守 as-if-serial 和 happens-before 规则)。
二、底层实现:对象头与 Monitor
- 对象头结构
每个 Java 对象在堆中存储时,对象头包含 Mark Word(存储锁状态)和 类型指针。
锁状态通过 biased_lock 和 lock 标志位标识。
2. Monitor 机制
每个对象关联一个 Monitor(由 C++ 实现的 ObjectMonitor 结构)。
Monitor 关键字段:
_owner:持有锁的线程。_EntryList:竞争锁时阻塞的线程队列。_WaitSet:调用 wait() 后进入等待状态的线程队列。
加锁过程:
线程尝试通过 CAS 操作将 Mark Word 替换为指向 Monitor 的指针。成功则获得锁;失败则进入 _EntryList 阻塞等待。
三、锁升级优化(JDK 6+)
为提高性能,JVM 会根据竞争情况动态升级锁状态:
- 偏向锁(Biased Lock)
适用场景:没有实际竞争,仅单个线程反复获取锁。实现:在 Mark Word 中记录线程 ID,后续同一线程无需 CAS 操作。
示例:
Object lock = new Object();
synchronized (lock) {
// 首次进入:升级为偏向锁
// 同步代码
}
- 轻量级锁(Lightweight Lock)
适用场景:锁竞争轻微,多线程交替执行。实现:通过 自旋(CAS) 尝试获取锁,避免线程阻塞。
synchronized (lock) {
// 存在竞争但短暂:升级为轻量级锁
for (int i = 0; i < 100; i++)
{
// 低竞争循环操作
}
}
- 重量级锁(Heavyweight Lock)
适用场景:高并发竞争,自旋消耗 CPU 资源。
实现:锁升级为重量级锁,未获取锁的线程进入阻塞状态(依赖操作系统互斥量)。
synchronized (lock)
{
// 高竞争场景:升级为重量级锁
// 高并发操作(如数据库连接池竞争)
}
四、性能优化机制
自适应自旋
JVM 根据历史自旋成功率动态调整自旋次数。
锁消除(Lock Elimination)
编译器通过逃逸分析,去除不可能存在竞争的锁(如局部变量同步)。
public void method()
{
Object localObj = new Object();
synchronized (localObj)
{
// 锁被消除
// 局部对象无并发访问
}
}
锁粗化(Lock Coarsening)
将相邻的同步块合并,减少锁的获取/释放次数。
synchronized (lock)
{
// 操作1
}
synchronized (lock)
{
// 合并为一个同步块
// 操作2
}
五、与 ReentrantLock 对比
特性 | synchronized | ReentrantLock |
实现方式 | JVM 内置实现 | 基于 AQS 的 API 实现 |
锁获取方式 | 自动加锁/解锁 | 需手动 lock() 和 unlock() |
灵活性 | 有限(非公平锁为主) | 支持公平锁与非公平锁 |
条件变量 | 通过 wait()/notify() 实现 | 通过 Condition 实现多个条件 |
锁升级优化 | 支持(偏向锁→轻量级→重量级) | 无锁升级,始终基于 AQS 竞争 |
六、总结
- 底层核心:通过对象头标记锁状态,依赖 Monitor 控制线程竞争。
- 锁升级:根据竞争激烈程度动态优化(偏向锁→轻量级→重量级)。
- 优化手段:自旋、锁消除、锁粗化降低同步开销。
- 适用场景:轻量级同步推荐 synchronized,复杂需求(如超时、公平性)使用 ReentrantLock。
- 上一篇: 探秘Java中的分布式锁:优雅地协调分布式系统
- 下一篇: Java锁机制的那些事儿
猜你喜欢
- 2025-05-15 Java并发编程(23)锁消除,锁粗化,偏向锁,轻量级锁,自旋锁
- 2025-05-15 在Java中如何用一把锁保护多个资源?
- 2025-05-15 【多线程系列】终于懂了 Java 中的各种锁
- 2025-05-15 Java有哪些锁,具体应用场景、代码实现以及优缺点对比有哪些
- 2025-05-15 Java中的锁原理、锁优化、CAS、AQS
- 2025-05-15 并发篇:一网打尽 Java 中的 8 种 ‘锁’ 事
- 2025-05-15 Java锁机制:让程序井然有序
- 2025-05-15 Java锁机制的那些事儿
- 2025-05-15 探秘Java中的分布式锁:优雅地协调分布式系统
- 2025-05-15 Java高并发编程中的锁优化:锁的那些事儿
你 发表评论:
欢迎- 05-15java使用iText解析PDF文件
- 05-15java 将pdf 形成的图片,每页一张图片 保存为pdf文件
- 05-15Java学习123——虚拟方法调用(Virtual Method Invocation)
- 05-15什么是JNI?为什么会有Native层?如何使用?
- 05-15Socket通信
- 05-15译文:理解Java中的弱引用
- 05-15Java 调用 DeepSeek 模型的完整示例及特点
- 05-15Java 对象和类
- 最近发表
- 标签列表
-
- java反编译工具 (77)
- java反射 (57)
- java接口 (61)
- java随机数 (63)
- java7下载 (59)
- java数据结构 (61)
- java 三目运算符 (65)
- java对象转map (63)
- Java继承 (69)
- java字符串替换 (60)
- 快速排序java (59)
- java并发编程 (58)
- java api文档 (60)
- centos安装java (57)
- java调用webservice接口 (61)
- java深拷贝 (61)
- 工厂模式java (59)
- java代理模式 (59)
- java.lang (57)
- java连接mysql数据库 (67)
- java重载 (68)
- java 循环语句 (66)
- java反序列化 (58)
- java时间函数 (60)
- java是值传递还是引用传递 (62)
本文暂时没有评论,来添加一个吧(●'◡'●)