原子变量

为了实现同步

sync.Mutex(传统方法)

原子变量与原子操作 - 图1
原子变量与原子操作 - 图2
结果:i = 100

sync下的一个包atomic(原子操作)

  1. - `import "sync/atomic"`
  2. - `var i int32 = 100`
  3. - `atomic.AddInt32(&i, n)`(这是其中的某个方法)
  4. - 内部用的cas(compare and swap)的思想,把现在的值和以前的值比较一下,一样的话就进程操作,不一样就不操作<font style="color:#E8323C;">(以前?后文会告知)</font>

修改上面的实例

原子变量与原子操作 - 图3
原子变量与原子操作 - 图4
结果:i = 100

原子操作详解

atomic提供的原子操作能够确保任一时刻只有一 个goroutine对变量进行操作, 善用atomic能够避免程序中出现大量的锁操作。

atomic常见操作有(5):

  • 增减(减就是加负数)
    原子变量与原子操作 - 图5
  • 载入/读——read/load(保证读的时候没有其他线程在操作
    原子变量与原子操作 - 图6
  • 比较并交换cas
    原子变量与原子操作 - 图7
  • 直接交换
    原子变量与原子操作 - 图8
  • 存储 write
    原子变量与原子操作 - 图9

:::info 实例

:::

发现每一个函数传入的都有指针

  • 增减减少
    原子变量与原子操作 - 图10结果原子变量与原子操作 - 图11
  • 读load
    原子变量与原子操作 - 图12结果:100
  • 写 load
    原子变量与原子操作 - 图13结果:200
  • 比较并交换cas,把值与old值(实例中是old)比较,一致就返回true,不一致返回false
    原子变量与原子操作 - 图14结果:200