golang-标准库(sync/atomic)
- 我们启动1000个协程,对a进行+1的操作
1
2
3
4
5
6
7
8
9
10
11
12
13
14func main() {
// 启动1000个协程,对a进行+1的操作
var a int64
var wg sync.WaitGroup
for i := 0; i < 1000; i++ {
wg.Add(1) // 并发组加1
go func() {
a++
wg.Done() // 并发组减1
}()
}
wg.Wait()
println(a) // 打印a
}
上面的运行结果并不是1000,下面是我的运行结果
- 下面用加锁的方式来保证数据的安全
的操作1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17func main() {
// 启动1000个协程,对a进行+1的操作
var a int64
var wg sync.WaitGroup
var s sync.Mutex
for i := 0; i < 1000; i++ {
wg.Add(1) // 并发组加1
go func() {
s.Lock() // 加锁
defer s.Unlock() // 释放所
a++
wg.Done() // 并发组减1
}()
}
wg.Wait()
println(a) // 打印a
}
上面结果你再运行,就能保证结果是1000,加锁保证的数据的安全。
- atomic包提供了原子性同步算法,下面看atomic包怎么保证数据安全
1
2
3
4
5
6
7
8
9
10
11
12
13
14func main() {
// 启动1000个协程,对a进行+1的操作
var a int64
var wg sync.WaitGroup
for i := 0; i < 1000; i++ {
wg.Add(1) // 并发组加1
go func() {
atomic.AddInt64(&a, 1) // 原子性的对a的值进行加1,操作数据的时候,其它线程不能修改a
wg.Done() // 并发组减1
}()
}
wg.Wait()
println(a) // 打印a
}
- 下面是atomic包提供的一几个方法,比较简单,都是对数据进行简单的修改操作:
1 | func AddInt64(addr *int64, delta int64) (new int64) => AddInt64原子性的将val的值添加到*addr并返回新值。 |
golang-标准库(sync/atomic)