首页/开发/代码质量与评审速查/评审检查项:并发与共享状态
代码评审64 条

评审检查项:并发与共享状态

并发检查:共享可变状态是否有保护、锁的范围与获取顺序、阻塞操作的超时与取消、回调在锁内执行的死锁风险。

并发检查看什么

并发缺陷在测试里常常不可复现,所以评审是主要的发现手段。检查重点是共享可变状态是否有保护、多把锁的获取顺序是否一致、阻塞操作是否有超时与取消、以及是否在持锁状态下调用外部代码或回调——最后这类是死锁的常见来源。

基本信息

检查重点共享可变状态、锁顺序、超时与取消、锁内调用
追问内容线程模型、不变量、锁保护的具体范围
替代方向不可变数据、串行化处理、消息传递减少共享
现实约束竞态问题在 CI 上往往复现不了,不能留给测试兜底

逐项看什么

  • 共享可变数据:加锁保护还是改为消息传递,锁粒度是否合理。
  • 锁顺序:多把锁时获取顺序是否全局一致,避免交叉等待形成死锁。
  • 超时与取消:阻塞操作是否有上限,取消后资源与状态如何收敛。
  • 锁内调用外部代码或回调:常见死锁来源,应尽量移到锁外执行。
  • 初始化与发布:单例、惰性初始化是否有正确的可见性与同步保证。

并发缺陷类型

类型表现看什么
竞态结果依赖执行时序共享状态是否有一致的保护机制
死锁互相等待,请求挂住锁顺序与锁内调用
活锁/饥饿反复重试但不推进重试策略与公平性
可见性问题读到过期值或半初始化对象发布方式与内存模型约束
资源泄漏并发压力下句柄耗尽取消与异常路径的资源释放
并发缺陷难复现:评审时问清线程模型与不变量,比只读代码更有效。
遇到依赖口头的时序假设(如「这个字段只被主线程读写」)时,要求把它变成代码层面的约束或加注释说明来源。

易错点

  • 信任「这个字段只被主线程读写」的口头假设:缺少机制保障,后续改动很容易破坏它。
  • 把竞态问题留给测试发现:并发缺陷在 CI 上常常不可复现。
  • 锁的范围过大:串行化把并发收益吃掉,压测时才暴露。
  • 在持锁状态下做网络或磁盘调用:响应变慢时容易连带触发死锁。
  • 取消路径没有清理:任务超时后连接与临时状态残留,累积成故障。

数据来源与参考

  • 《Java Concurrency in Practice》(Brian Goetz 等,并发缺陷分类)
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌