java锁机制通过分层分级策略主动规避并发争抢:减少竞争(分段锁、细粒度锁、threadlocal)、缩短持有时间(快进快出、锁内无耗时操作)、无锁替代(atomic类、避免虚假共享)、利用jvm优化(偏向锁、自旋、锁消除与粗化)。

Java 中锁机制应对并发争抢导致的性能损耗,并不是靠“硬扛”,而是通过分层、分级、分场景的策略主动规避或缓解。核心思路是:能不抢就不抢,抢得少就少等,抢不过就换路走。
减少锁竞争频率
争抢的本质是多个线程同时盯上同一把锁。降低竞争最直接的方式是让它们“各管各的”:
- 把全局锁拆成局部锁,比如 ConcurrentHashMap 用分段(Segment)或 Node 级锁,不同 key 落在不同桶里,修改互不影响;
- 避免方法级同步,只对真正需要保护的临界区加锁,例如把
synchronized method()改为仅包裹count++的代码块; - 用线程局部变量(ThreadLocal)隔离状态,彻底消除共享,比如数据库连接、格式化器、上下文对象。
缩短锁持有时间
锁占着越久,别人等得越急,上下文切换越多。关键在于“快进快出”:
- 临界区内不做耗时操作:不查数据库、不调远程接口、不执行复杂计算;
- 提前准备好数据,锁内只做原子更新,比如先算好新值,再用
AtomicInteger.compareAndSet()一次写入; - 避免在 synchronized 块中调用可能阻塞或被重入的方法,防止锁被意外长时间持有。
用无锁替代有锁
当竞争不激烈或操作足够简单时,无锁方案往往更高效:
- 计数类场景优先用 AtomicLong 或 LongAdder(后者在高并发下比 AtomicLong 更优,因内部采用分段累加+最终合并);
- 状态标记用 AtomicBoolean,避免为一个布尔字段引入整个锁对象;
- 注意虚假共享:多个原子变量若在同一个 CPU 缓存行(64 字节),会相互干扰,可通过
@Contended注解或手动填充字段隔离。
利用 JVM 内置锁优化机制
HotSpot 虚拟机本身已做了大量透明优化,合理使用可“躺赢”:
- 偏向锁:默认开启,适用于单线程反复进入同一同步块的场景,首次获取后几乎零开销;
- 轻量级锁 + 自适应自旋:短时间竞争时,让等待线程在用户态循环尝试,避免陷入内核态挂起/唤醒的高成本;
- 锁消除:JIT 编译器识别出锁实际不会逃逸(如 StringBuffer 在方法内创建并使用),直接删掉同步指令;
- 锁粗化:连续多次对同一对象加锁/解锁,编译器会合并成一个更大范围的锁,减少指令开销。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











