[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"$fWEFRu_EK8VUZDJbGEmfAR71MMGVWJ3zjbu1mehdTwSU":3},{"item":4,"related":48},{"id":5,"type":6,"title":7,"slug":8,"summary":9,"body":10,"coverUrl":11,"productScreenshots":12,"productLinks":13,"authorName":14,"authorUrl":15,"authorSubject":16,"category":17,"tags":22,"sourceLabel":39,"sourceName":40,"sourceUrl":41,"status":42,"seoTitle":7,"seoDescription":9,"canonicalUrl":39,"isFeatured":43,"sno":44,"sortOrder":45,"publishedAt":46,"updatedAt":47,"createdAt":47},"502b9b51-bf94-44d1-9327-9ffb4fcf3616","article","Linearizability：多线程操作如何看起来像在同一瞬间完成？","linearizability-concurrent-correctness-explained","Linearizability 要求并发操作看起来像在调用与返回之间某个瞬间原子完成，并且整体顺序符合实时关系。本文通过队列和线性化点解释线程安全的精确定义，避免把“能运行”误当成“并发正确”。","并发程序最让人困惑的地方是：操作彼此重叠，却仍然要让使用者感觉结果有一个合理顺序。Linearizability，中文常译为“线性一致性”，是一种非常强的并发正确性标准。它要求每个操作看起来都在调用和返回之间某个瞬间完成，并且所有操作可以排成一个符合实时顺序的串行历史。\n\n## 什么是“线性化点”\n\n假设两个线程同时向一个并发队列入队。它们的执行可能交错，但对外部观察者而言，每次入队都应该能找到一个瞬间，仿佛整个操作在那里原子完成。这个瞬间就是线性化点。\n\n线性化点不一定对应某一行显眼的代码。有时它是一次 CAS 成功，有时是锁释放，有时需要结合多个步骤推理。找到线性化点，可以帮助工程师把复杂的并发执行还原成一个可理解的顺序。\n\n## 它和“最终一致”不同\n\n线性一致性关注的是单个并发对象或操作在时间上的表现：读操作不能看到违反实时顺序的结果。分布式系统里的最终一致性则允许副本暂时不同，只要求经过一段时间后收敛。两者解决的问题不同，强一致性通常需要付出更高的同步和延迟成本。\n\n也不要把线性一致性理解成“所有代码真的串行执行”。它允许实现内部并行，只要求外部可观察行为等价于某个合法的串行顺序。\n\n## AI 编程为什么需要这个概念\n\nAI 很容易生成一个看似合理的并发容器，却没有说明读写重叠时应该返回什么。用线性化性提问，可以把模糊的“线程安全”具体化：每个方法的线性化点在哪里？所有合法历史是否都能映射到顺序规范？失败或超时操作如何处理？\n\n## 读者应该记住\n\nLinearizability 是把并发行为讲清楚的一种语言：虽然执行同时发生，但每个操作都像在某个瞬间完成。它帮助我们定义、实现和验证并发对象的可观察正确性。\n\n资料：[Herlihy & Wing：Linearizability](https:\u002F\u002Fwww.cs.cmu.edu\u002F~wing\u002Fpublications\u002FHerlihyWing90.pdf)","\u002Fuploads\u002F2026-09-20\u002F8ba04ebd-f57c-424e-908a-df4925067f1e.jpg",[],[],"Foundit","https:\u002F\u002Ffoundit.cn","foundit-ai-editorial",{"id":18,"name":19,"slug":20,"description":21},"6179d3b6-dc34-4483-9ded-3cd9f1b37a47","科普","abbreviation","介绍各领域新兴概念",[23,27,31,35],{"id":24,"name":25,"slug":26},"144abe77-0dc6-4f66-a176-20bddb1c0bfa","编程","coding",{"id":28,"name":29,"slug":30},"4c2bbea6-eab7-40a8-8447-1de478ff7749","分析","analyse",{"id":32,"name":33,"slug":34},"7c76bfc2-f80f-4ee0-a95d-27bd8708b434","技术","slug",{"id":36,"name":37,"slug":38},"68cedb55-2cac-412f-8f81-fda8c7d686dd","思考","thought",null,"Herlihy & Wing：Linearizability","https:\u002F\u002Fwww.cs.cmu.edu\u002F~wing\u002Fpublications\u002FHerlihyWing90.pdf","published",false,59,0,"2026-09-20T00:00:00.000Z","2026-09-20T03:58:06.653Z",[49,57,66],{"id":50,"type":6,"title":51,"slug":52,"summary":53,"coverUrl":54,"authorName":14,"sno":55,"publishedAt":46,"createdAt":56},"05351c3a-3592-4ecb-aaeb-276a3bb2a79e","Abstract Interpretation：静态分析为什么不用真正运行程序？","abstract-interpretation-static-analysis-explained","Abstract Interpretation 用可计算的抽象状态近似程序行为，让工具在没有真实输入的情况下发现潜在问题。本文解释抽象、保守估计、循环收敛和误报，帮助读者理解静态分析为什么既强大又不总能给出确定答案。","\u002Fuploads\u002F2026-09-20\u002F3e0cf61b-b0dc-4028-b368-c4c013d026eb.jpg",41,"2026-09-20T03:57:49.227Z",{"id":58,"type":6,"title":59,"slug":60,"summary":61,"coverUrl":62,"authorName":14,"sno":63,"publishedAt":64,"createdAt":65},"58fc0fe2-4392-402e-bd43-68da30f7b50f","RPKI 路由源验证：怎样确认一个网络前缀确实由某个 AS 宣告？","rpki-bgp-route-origin-validation","RPKI 路由源验证通过 ROA 检查前缀与起源 AS 是否匹配。本文解释 Valid、Invalid、NotFound 的含义，以及它为何不验证整条路由路径。","\u002Fuploads\u002F2026-10-06\u002F073132a3-dfee-42bd-b7f1-9f6805946e8b.jpg",40,"2026-10-06T00:00:00.000Z","2026-10-06T07:51:36.206Z",{"id":67,"type":6,"title":68,"slug":69,"summary":70,"coverUrl":71,"authorName":14,"sno":55,"publishedAt":72,"createdAt":73},"5e0c84da-6011-41e8-b1f7-726c8bf0b30a","RCU：读多写少的系统，为什么敢让读者几乎不加锁？","rcu-read-copy-update-explained","RCU 把共享数据的更新与旧版本回收拆开，让读者以极低成本读取，同时等待所有旧读者离开后再释放内存。本文用导览图解释它的读侧、宽限期与适用边界。","\u002Fuploads\u002F2026-09-26\u002F3398ce37-ca4f-4cc3-84b3-fe931d2f055d.jpg","2026-09-27T00:00:00.000Z","2026-09-26T16:25:40.784Z"]