> For the complete documentation index, see [llms.txt](https://wtifs.gitbook.io/diva-notes/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://wtifs.gitbook.io/diva-notes/go/5.-bing-fa-bian-cheng/7.atomic.md).

# 7.atomic

`a++` 操作不是原子操作。它会先读取 `a` 的值，然后将值加 1，最后再写回 `a`，这个过程中可能会被其他 Goroutine 中断或者修改 `a` 的值，从而出现非预期结果。所以，在并发环境中使用 `a++` 操作时，需要保证操作的原子性，可以使用 `sync.Mutex` 或者 `atomic.AddInt32` 等方式确保操作的原子性。

使用 `atomic.AddInt32(&a, 1)` 这样的原子操作通常会更加高效，因为不需要使用锁或者其他同步机制，避免了不必要的上下文切换和同步开销。

`atomic.AddInt32` 函数的原理是，先读取变量的值，然后将需要加的值加上去，最后使用 CAS 指令将加完之后的结果写回内存。如果 CAS 操作成功，说明变量在操作期间没有被其他 Goroutine 修改过，此时返回新的值；如果 CAS 操作失败，则说明变量在操作期间已被其他 Goroutine 修改过，此时需要重新读取变量的值并重新尝试加操作，直到 CAS 操作成功为止。
