什么是 synchronized?
synchronized 是 Java 中用于实现线程同步的关键字,它可以确保多个线程在访问共享资源时的互斥性,防止数据竞争和不一致状态。
底层实现机制
在 JVM 层面,synchronized 的实现依赖于对象头中的 Mark Word 和 Monitor(监视器) 机制。根据竞争程度不同,JVM 会动态调整锁的状态:
- 无锁状态:初始状态,未加锁。
- 偏向锁(Biased Locking):适用于只有一个线程反复进入同步块的场景,减少不必要的 CAS 操作。
- 轻量级锁(Lightweight Locking):当有多个线程竞争但未发生阻塞时使用,通过自旋尝试获取锁。
- 重量级锁(Heavyweight Locking):当自旋失败或竞争激烈时,线程会被挂起,由操作系统调度。
字节码层面分析
使用 synchronized 修饰方法或代码块时,编译后的字节码会包含 monitorenter 和 monitorexit 指令(代码块方式),而同步方法则通过 ACC_SYNCHRONIZED 标志位标识。
锁优化与升级流程
JVM 对 synchronized 做了大量优化,锁只能升级不能降级,典型路径为:
无锁 → 偏向锁 → 轻量级锁 → 重量级锁
这种设计兼顾了低竞争下的性能与高竞争下的稳定性。
使用建议
- 尽量缩小同步范围,只同步必要的代码。
- 避免在同步块中执行耗时操作或 I/O。
- 优先考虑使用
java.util.concurrent包中的高级并发工具。