【golang】优雅且安全的并发写slice或map

并发写 slice和map是不安全的

【golang面试准备】验证map&slice并发不安全

怎么能高并发写入?

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 (
	
  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值