锁/竞争
2019-01-25 11:55
351 查看
a. import(“sync”)
b. 互斥锁, var mu sync.Mutex (只有一个释放之后,下一个才能进去)
c. 读写锁, var mu sync.RWMutex(读不锁,只有写才锁)
d.原子锁,import "sync/atomic"
比如map,文件等被多个goroutine修改,则要做好锁。
只读无需加锁
用go build -race xxx.go来编译,并运行二进制文件来查看竞争关系
互斥锁举例:
a := make(map[int]int, 5) a[0] = 10 fmt.Println(a) for i := 0; i < 2; i++ { go func(b map[int]int){ //设置互斥锁 lock.Lock() a[0] = rand.Intn(100) lock.Unlock() }(a) } //互斥锁不读还是写,都要设置才能确保不竞争 lock.Lock() fmt.Println(a) lock.Unlock()
读写锁(包括原子锁)举例:
package main import ( "sync" "fmt" "math/rand" "time" "sync/atomic" ) var rwLock sync.RWMutex func main() { var count int32 //读写锁 a := make(map[int]int, 5) a[0] = 10 fmt.Println(a) for i := 0; i < 2; i++ { go func(b map[int]int){ //写的锁是Lock rwLock.Lock() a[0] = rand.Intn(100) rwLock.Unlock() }(a) } for i := 0; i < 100; i++ { go func(b map[int]int){ //读的锁是RLock rwLock.RLock() fmt.Println(a) //原子锁引用赋值count,每次加一 atomic.AddInt32(&count, 1) rwLock.RUnlock() }(a) } time.Sleep(time.Second) //输出原子锁次数也要有固定写法 fmt.Println(atomic.LoadInt32(&count)) }
相关文章推荐
- 云基础设施自动化创业公司Opscode融资1950万,面临来自IBM的竞争压力
- 并发与竞争
- 空间域名的市场竞争演变
- 腾讯为何能跑那么快?外部压力与内部竞争
- .Net下RabbitMQ的使用(3) -- 竞争的消费者
- 具有竞争条件的程序 | Unix进程控制
- 浅谈互联网竞争中的不对称战争
- 数字电路的竞争与冒险
- 微信与微博竞争白热化 疑微信屏蔽新浪微博关键词
- F5:SDN与ADN竞争还是合作?
- linux中避免竞争条件的途径
- 双缓冲消息队列-减少锁竞争
- 高强度紧固件市场竞争越来越激烈 企业如何应对
- GCD实战2:资源竞争
- 介绍Go竞争检测器
- 传统媒体应对全新传媒竞争环境的双刃利器
- 云趋势:SaaS走向全球IaaS竞争激烈PaaS前景堪忧
- 腾讯联姻京东,开启电商竞争新纪元
- 多线程锁竞争造成的开销
- 数学建模高级方法(七):自组织竞争神经网络