并发写 slice和map是不安全的
怎么能高并发写入?
slice&map并发不安全,都是在写的时候发生的,那么就要保证同一时间只有一个gorutine来写这个slice或者map。
有两种方式实现:
- 加锁方式:n个goroutine都有可能执行写入操作,保证同一时间只能有一个在执行写操作。 加锁操作简单,适用于性能要求低和逻辑不复杂的场景。
package main
import (
"fmt"
"sync"
)
func main() {
slc := []int{}
n := 10000
var wg sync.WaitGroup
var lock sync.Mutex
wg.Add(n)
for i := 0; i < n; i++ {
go func(a int) {
lock.Lock()
slc = append(slc, a)
lock.Unlock()
wg.Done()
}(i)
}
wg.Wait()
fmt.Println("done len:", len(slc))
}
- Active Object方式:只有1个goroutine在执行写操作。避免多个goroutine竞争锁。 适合业务场景复杂,性能要求高的场景。
package main
import (