golang atomic.Value用法

  • 自定义可原子操作的变量类型
package main

import (
    "log"
    "sync"
    "sync/atomic"
)

type Config struct {
    a []int
}

func main() {
    var v atomic.Value
    v.Store(&Config{}) // 这行不能省
    go func() {
        i := 0
        for {
            i++
            /*
              错误示范
              cfg.a = []int{i, i + 1, i + 2, i + 3, i + 4, i + 5}
            */
            cfg := &Config{a: []int{i, i + 1, i + 2, i + 3, i + 4, i + 5}}
            v.Store(cfg)
        }
    }()

    var wg sync.WaitGroup
    for n := 0; n < 4; n++ {
        wg.Add(1)
        go func() {
            for n := 0; n < 100; n++ {
                cfg := v.Load().(*Config)
                log.Printf("%v\n\n", cfg)
            }
            wg.Done()
        }()
    }
    wg.Wait()
}

总结:

atomic.Value提供了一种自定义变量类型的原子操作, 读: v.Load().(*Config), 写: v.Store(cfg), 并且初始化 var v atomic.Value 后, 需要指定v的读写类型, 即 v.Store(&Config{})

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容