Linus:为何对象引用计数必须是原子的
Linus在这篇长文里,用一个具体的编程细节,撕开了“并行计算很简单”这个流行错觉的口子。他聚焦于一个看似基础的问题:为什么在多线程环境下,对象的引用计数必须是原子操作。 文章的核心论证在于区分两种完全不同的锁机制:一种是保护“对象数据”的锁,另一种是保护“查找对象”这一过程的锁。Linus指出,引用计数的原子性之所以关键,是因为在复杂的对象图(graph)中遍历时,为了避免死锁(特别是经典的ABBA死锁),你必须在持有对象A的锁时,安全地转向对象B。此时,原子性地增加对象B的引用计数,就成了确保对象B在解锁后不会“消失”的唯一安全绳。如果你认为引用计数不需要原子化,这恰恰暴露了你对锁机制复杂性的无知。 通过这个精巧的例证,Linus抨击了那些只看到简单数组并行排序、却无视真实世界中对象动态分配与释放复杂性的乐观论调。他用这个例子揭示,许多被宣传为“容易并行化”的案例,其实都巧妙回避了并发编程中最棘手的部分。这篇文章最终指向一个硬核结论:并发设计本质上是困难的,而许多关于并行未来的讨论,建立在对这种困难严重低估的基础上。