[Golang]同步工具-sync包的原子操作(下)-心智图总结

1. 比较和交换(compare and swap,简称CAS)跟交换(swap)有什麽不同?
比较和交换(CAS),是有条件的交换操作,指有在条件满足的情况下才会进行值的交换。而交换,把新值赋给变数,并回传旧值。
在进行CAS操作的时候,函数会先判断操作变数的当前值,是否与我们预期的旧值相等。如果相等,函数就会把新值赋给该变数,并回传true以表明交换操作以进行。否则就忽略交换操作,并回传false。

2. 对一个变数的写操作都是原子操作,比如:加或减法、比较和交换、储存、交换。要对该变数进行读操作的时候,还有必要使用原子操作吗? 有必要。

3. 怎麽用 sync/atomic.Value?
A. atomic.Value为开箱即用。atomic.Value的类型属於结构体类型,它只有两个指针方法,Store、Load。
B. 向atomic.Value的变数,储存的第一个值,就决定了它今後只能储存哪一个类型的值。

4. atomic.Value 程序范例

package main

import (
  "fmt"
  "sync/atomic"
)

func main() {
  var str atomic.Value
  tmp_str := "ABCDEFGH"
  str.Store(tmp_str)
  fmt.Printf("The value load from str is %v.\n", str.Load())
  fmt.Println()

  //tmp_val := 123
  //str.Store(tmp_val) //会引发panic,储存的类型不同
}

https://play.golang.org/p/11VVBr5K5NP

5. sync/atomic.Value的类型
type Value struct {
v interface{}
}
func (v *Value) Store(x interface{})
func (v *Value) Load() (x interface{})

https://ithelp.ithome.com.tw/upload/images/20201127/20131728oopC0N3dfm.png

https://ithelp.ithome.com.tw/upload/images/20201127/20131728ctjLjFXTLK.png
参考来源:
郝林-Go语言核心36讲
https://github.com/hyper0x/Golang_Puzzlers
https://golang.org/pkg/cmd/go/internal/test/


<<:  [ Day 35 ] - Electron 应用程序 - 更新自动化 ( 说明篇 )

>>:  安全系统开发方法

Day-26 : Model 一对一

Model之间的关联,主要分为三个 一对一:每位使用者(User)可以开一家店(Store) 一对多...

30天轻松学会unity自制游戏-设定画面按钮

现在死亡後有了两个选项,一个重新开始游戏,一个是回到标题,目前只有一个场景,所以第一步快速制作一个开...

Day 12 多工等待跟号志同步与信用追踪同步

我们在本篇来说一下,号志使用的第二种方式:多工等待跟号志同步。 如果说,有三个优先任务在执行多工处理...

React和DOM的那些事-节点新增算法

点击进入React源码调试仓库。 本篇是详细解读React DOM操作的第二篇文章,文章所讲的内容发...

Day26. Blue Prism取号一把罩–BP自动取得订单编号

一般订购的程序都是由下订单开始, 接着取单号为依据来分批或批次采购相关物资, 因此订单编号有举足轻重...