午夜咖啡午夜咖啡

jolestar 的文章与笔记。

Post

好的并发代码,不等于 clever code

2016-11-14 23:23:37Post

并发实现可以复杂,但复杂不等于巧;真正高质量的代码最终还是要让约束和行为清楚可推理。

很多人一看到不好懂的代码,就会直接扣上 clever code 的帽子。但在并发基础设施这类地方,这个判断经常过于粗暴。

Doug Lea 写的那些并发实现,包括 ForkJoinPoolConcurrentSkipListMap 这类代码,本来就不是靠“直白流程”取胜的。它们面对的是竞争条件、内存语义、无锁路径和性能边界这些本来就复杂的问题,所以实现复杂并不奇怪。

我会觉得,真正需要警惕的不是“代码有点难”,而是那种复杂度没有问题支撑、只是作者为了炫技巧堆出来的写法。

反过来说,好的并发代码往往有个共同特点:

  • 表面上可能不简单
  • 但结构通常是有明确约束的
  • 每个分支和原子操作都对应实际问题

所以评价这类代码,关键不是它一眼看上去顺不顺,而是它的复杂度到底是不是被问题本身逼出来的。