iT邦幫忙

0

[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/


尚未有邦友留言

立即登入留言