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 mainimport ( "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/