减少锁粒度是提升并发性能最直接有效的手段,即用多把小锁分别保护不同数据区域,避免线程竞争同一把锁,如concurrenthashmap分段锁、账户系统按实例加锁、读写锁分离等。

减少锁粒度是提升并发性能最直接有效的手段之一。核心在于:把“一把大锁管所有”变成“多把小锁各管一块”,让线程不再挤在同一个锁上排队,而是能并行操作互不干扰的数据区域。
按数据结构分片加锁
对共享集合或状态容器进行逻辑或物理拆分,每个子区域配独立锁。例如:
- 银行账户系统中,每个Account对象用自己的Object lock保护余额,转账时只锁源账户和目标账户两把锁,而非全局锁
- 自定义任务队列可切分为N个分区队列,入队/出队按哈希或轮询路由到具体分区,锁竞争下降至约1/N
- ConcurrentHashMap 的分段锁(Java 7)或 CAS + 链表转红黑树(Java 8+)本质都是对哈希桶数组做粒度细化
按功能维度分离锁
同一对象的不同操作可能互不影响,可为读、写、统计等行为分配不同锁:
- 用ReentrantReadWriteLock替代 synchronized:读多写少场景下,多个线程可同时持读锁,仅写操作独占写锁
- 缓存类对象中,get() 和 invalidateAll() 使用不同锁,避免清空全部缓存时阻塞所有读请求
- 日志收集器里,追加日志与刷盘落盘使用两个锁,防止 I/O 延迟拖慢日志写入
避免过度拆分与调度开销
锁粒度不是越小越好,需平衡竞争降低与管理成本:
- 分区数过多会导致路由策略变重,比如“填谷式”负载均衡需遍历所有分区,反而增加延迟
- 锁对象本身有内存与 GC 开销,极细粒度(如每个数组元素一把锁)通常得不偿失
- 建议从热点数据入手——先用 VisualVM 或 JFR 定位高争用锁,再针对性分片,而非盲目拆解
实际效果取决于数据访问模式是否天然具备局部性。若线程长期集中在少数几个分片上,仍会出现“热点锁”,这时需结合一致性哈希、动态再平衡等策略进一步优化。










