golang实现协程安全的几种方式

本文介绍了使用Go语言实现协程安全的五种方法:channel-monitorgoroutine、channel-serialconfinement、mutualexclusion、mutualexclusion-RWMutex以及LazyInitialization-sync.Once。通过这些方法,开发者可以有效地管理和保护共享资源,避免并发访问导致的数据不一致问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

近些年go语言越来越多的被用在公司的开发中,同时学习go语言的朋友越来越多,小猿圈也为了跟上时代的脚步,给大家整理一些用go语言实现协程安全的几种方式。

1.channel - monitor goroutine var deposits = make(chan int) // send amount to deposit var balances = make(chan int) // receive balance

func Deposit(amount int) { deposits <- amount } func Balance() int { return <-balances }

func teller() { var balance int // balance is confined to teller goroutine for { select { case amount := <-deposits: balance += amount case balances <- balance: } } } func init() { go teller() // start the monitor goroutine } 2.channel - serial confinement type Cake struct{ state string }

func baker(cooked chan<- *Cake) { for { cake := new(Cake) cake.state = "cooked" cooked <- cake // baker never touches this cake again } }

func icer(iced chan<- *Cake, cooked <-chan *Cake) { for cake := range cooked { cake.state = "iced" iced <- cake // icer never touches this cake again } } 3.mutual exclusion import "sync"

var mu sync.Mutex // guards balance var balance int

func Deposit(amount int) { mu.Lock() balance = balance + amount mu.Unlock() }

func Balance() int { mu.Lock() defer mu.Unlock() return balance } 4.mutual exclusion - RWMutex import "sync"

var mu sync.RWMutex // guards balance var balance int

func Deposit(amount int) { mu.Lock() balance = balance + amount mu.Unlock() }

func Balance() int { mu.RLock() //readers lock defer mu.RUnlock() return balance } RLock允许读取并行,写入和读取完全互斥,多次读取,一次写入 5.Lazy Initialization - sync.Once var loadIconsOnce sync.Once var icons map[string]image.Image // Concurrency-safe. func Icon(name string) image.Image { loadIconsOnce.Do(loadIcons) return icons[name]

不知道大家有没有学习到,希望大家可以关注我,也可以分享给需要的朋友,小猿圈会持续更新go语言知识的,记得点赞哦!

转载于:https://juejin.im/post/5cdcc7c76fb9a031ff0d3d64

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值