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{})
參考來源:
郝林-Go语言核心36讲
https://github.com/hyper0x/Golang_Puzzlers
https://golang.org/pkg/cmd/go/internal/test/