近些年 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(amountint) { deposits <- amount }
func Balance()int { return <-balances }
func teller() {
var balance int // balance is confined toteller 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(cookedchan<- *Cake) {
for {
cake := new(Cake)
cake.state = "cooked"
cooked <- cake // baker nevertouches this cake again
}
}
func icer(icedchan<- *Cake, cooked <-chan *Cake) {
for cake := range cooked {
cake.state = "iced"
iced <- cake // icer nevertouches this cake again
}
}
3.mutual exclusion
import"sync"
var mu sync.Mutex // guards balance
var balance int
func Deposit(amountint) {
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(amountint) {
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 loadIconsOncesync.Once
var iconsmap[string]image.Image
//Concurrency-safe.
func Icon(namestring) image.Image {
loadIconsOnce.Do(loadIcons)
return icons[name]
不知道大家有没有学习到,希望大家可以关注我,也可以分享给需要的朋友,小猿圈会持续更新go语言知识的,记得点赞哦!
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网
猜你喜欢:本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
Web Data Mining
Bing Liu / Springer / 2006-12-28 / USD 59.95
Web mining aims to discover useful information and knowledge from the Web hyperlink structure, page contents, and usage data. Although Web mining uses many conventional data mining techniques, it is n......一起来看看 《Web Data Mining》 这本书的介绍吧!