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 操作成功为止。

Last updated