[{"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},"62724dbd-ce49-4be9-afa9-4ba127513a62","语音搜索一定先变成文字吗？AI 开始绕过转写这一步","speech-to-retrieval-without-transcription","传统语音搜索先把声音转成文字，再拿文字查资料，一次听错就可能让搜索方向完全跑偏。Speech-to-Retrieval 尝试直接把语音与相关文档映射到同一个语义空间。本文用蒙克名画的例子讲清新旧架构及其边界。","\u002Fuploads\u002F2026-09-08\u002Fe1173842-1ec4-48f3-8349-240fc2d78197.jpg",50,"2026-08-30T00:00:00.000Z","2026-08-14T03:06:11.525Z",{"id":67,"type":6,"title":68,"slug":69,"summary":70,"coverUrl":71,"authorName":14,"sno":72,"publishedAt":73,"createdAt":74},"0999bb14-a97c-4003-84e7-61ad2da998e0","文件删除以后去了哪里？为什么有时还能恢复？","where-deleted-files-go-data-recovery","普通删除往往只是移除文件系统里的索引并把空间标记为可重用，数据本身未必立即消失；SSD 的 TRIM、磨损均衡与加密又让情况更加复杂。本文区分回收站、删除、覆盖和安全清除，说明何时应停止写入设备。","\u002Fuploads\u002F2026-09-08\u002Fb7222764-de75-4863-8679-0a94a8965af3.jpg",51,"2026-08-20T00:00:00.000Z","2026-08-14T03:06:15.710Z"]