golang实现协程安全的几种方式
版本
golang -- 1.12.4golang协程同步
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]
}
到此这篇关于“golang实现协程安全的几种方式”的文章就介绍到这了,更多文章或继续浏览下面的相关文章,希望大家以后多多支持JQ教程网!
您可能感兴趣的文章:
如何在golang中关闭bufio.reader_golang 并发编程
go 协程
golang知识点
golang编程技巧:利用GC机制优雅地关闭协程,避免内存泄漏
golang runtime 简析
go 开了多少个goroutine 怎么看_Golang 协程Goroutine到底是怎么回事?(一)
浅谈Go语言的Goroutine和协程
探索Golang协程实现——从v1.0开始
Go语言潜力有目共睹,但它的Goroutine机制底层原理你了解吗?
Golang的魅力