Back

Golang的原子操作atomic

Golang的原子操作atomic

[未完成…]

Go语言中的原子操作由标准库内置的sync/atomic/包提供。

通常使用原子操作比使用锁的效率更高。

atomic 操作的对象是一个地址,你需要把可寻址的变量的地址作为参数传递给方法,而不是把变量的值传递给方法

Add系列方法

CAS (CompareAndSwap)系列方法

Swap系列方法

Load系列方法

Store系列方法

Value类型

atomic 还提供了一个特殊的类型:Value。它可以原子地存取对象类型,但也只能存取,不能 CAS 和 Swap,常常用在配置变更等场景中。

type Value struct {
	v any
}
func (v *Value) Load() (val any) {}
func (v *Value) Store(val any) {}

示例

type Config struct {
	NodeName string
	Addr     string
	Count    int32
}
func LoadNewConfig() Config {
	return Config{
		NodeName: "北京",
		Addr:     "10.23.25.108",
		Count:    rand.Int31(),
	}
}
// atomic.Value的Load/Store的使用
func main() {
	var config atomic.Value
	config.Store(LoadNewConfig())
	var cond = sync.NewCond(&sync.Mutex{})
	// 设置新的config
	go func() {
		for {
			time.Sleep(time.Duration(5+rand.Int63n(5)) * time.Second)
			config.Store(LoadNewConfig())
			// 通知等待者条件已变更
			cond.Broadcast()
		}
	}()
	go func() {
		cond.L.Lock()
		cond.Wait()
		c := config.Load().(Config)
		fmt.Printf("new config:%v\n", c) // new config:{北京 10.23.25.108 1427131847}
		cond.L.Unlock()
	}()
	select {}
}
Built with Hugo
Theme Stack designed by Jimmy
© Licensed Under CC BY-NC-SA 4.0