<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>内存模型 on Chen Shungen</title><link>https://chenshungen.cn/tags/%E5%86%85%E5%AD%98%E6%A8%A1%E5%9E%8B/</link><description>Recent content in 内存模型 on Chen Shungen</description><generator>Hugo</generator><language>zh-cn</language><lastBuildDate>Mon, 20 Apr 2026 14:25:00 +0800</lastBuildDate><atom:link href="https://chenshungen.cn/tags/%E5%86%85%E5%AD%98%E6%A8%A1%E5%9E%8B/index.xml" rel="self" type="application/rss+xml"/><item><title>Go 内存模型</title><link>https://chenshungen.cn/blog/golang-concurrency/golang-memory-model/</link><pubDate>Mon, 20 Apr 2026 14:25:00 +0800</pubDate><guid>https://chenshungen.cn/blog/golang-concurrency/golang-memory-model/</guid><description>&lt;p>前面的文章我们讲了 Mutex、Channel、atomic 等各种并发工具，但有一个更底层的问题我们还没回答——&lt;strong>一个 goroutine 写入的值，另一个 goroutine 什么时候能看到？&lt;/strong> 这就是 Go 内存模型（The Go Memory Model）要回答的问题。&lt;/p>
&lt;blockquote>
&lt;p>&lt;strong>注意&lt;/strong>：这里的&amp;quot;内存模型&amp;quot;不是内存分配/回收，而是 &lt;strong>并发环境下变量的可见性规则&lt;/strong>。&lt;/p>&lt;/blockquote>
&lt;h2 id="一为什么需要内存模型">一、为什么需要内存模型？&lt;/h2>
&lt;p>直觉上，代码应该按你写的顺序执行。但现实中有两个因素会打破这种直觉：&lt;/p>
&lt;div class="highlight-wrapper">
 &lt;button class="copy-code-btn" type="button" aria-label="Copy code to clipboard">
 &lt;svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true">
 &lt;rect x="9" y="9" width="13" height="13" rx="2" ry="2">&lt;/rect>
 &lt;path d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1">&lt;/path>
 &lt;/svg>
 &lt;span class="copy-text">Copy&lt;/span>
 &lt;/button>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">┌──────────────────────────────────────────────────────────────┐
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ 打破执行顺序的两个因素 │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">├──────────────────────────────────────────────────────────────┤
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ 1. 编译器重排 │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ 编译器为了优化性能，可能调整指令执行顺序 │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ 只要在单 goroutine 内语义不变，就允许重排 │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ 2. CPU 多级缓存 │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ 每个 CPU 核有自己的 L1/L2 缓存 │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ 一个核写入的值不一定立即对其他核可见 │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">└──────────────────────────────────────────────────────────────┘&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>
&lt;p>看一个例子：&lt;/p></description></item></channel></rss>