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

本文探讨了在Golang中并发写入slice和map的安全问题,指出并发写入会导致不安全,特别是在面试中这是一个常见的话题。为了在高并发下安全地写入,提出了两种解决方案:一是使用加锁机制,确保同一时刻只有一个goroutine执行写操作,适用于性能要求较低的情况;二是采用Active Object模式,将写操作限制在一个goroutine中,适合于复杂业务逻辑和高性能需求的场景。
摘要由CSDN通过智能技术生成

并发写 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 (
	
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值