标签:RWMutex start read over sync println 读锁 time Go
RWMutex
RWMutex有两种锁写锁和读锁,用法也有不同,首先读锁可以同时加多个,但是写锁就不行 只能1个
该锁可以加多个读锁或者一个写锁,其经常用于读次数远远多于写次数的场景.
原则
- 1、读锁的时候无需等待读锁的结束
- 2、读锁的时候要等待写锁的结束
- 3、写锁的时候要等待读锁的结束
- 4、写锁的时候要等待写锁的结束
操作
- RLock() //读锁定
- RUnlock() //读解锁
- Lock() //写锁定
- Unlock() //写解锁
实例
package main
import (
"sync"
"time"
)
var m *sync.RWMutex
func main() {
m = new(sync.RWMutex)
// 多个同时读
go read(1)
go read(2)
time.Sleep(2*time.Second)
}
func read(i int) {
println(i,"read start")
m.RLock()
println(i,"reading")
time.Sleep(1*time.Second)
m.RUnlock()
println(i,"read over")
}
运行结果:
1 read start
1 reading
2 read start
2 reading
1 read over
2 read over
可以看出1 读还没有结束,2已经在读 所以读锁之间不影响
package main
import (
"sync"
"time"
)
var m *sync.RWMutex
func main() {
m = new(sync.RWMutex)
// 写的时候啥也不能干
go write(1)
go read(2)
go write(3)
time.Sleep(2*time.Second)
}
func read(i int) {
println(i,"read start")
m.RLock()
println(i,"reading")
time.Sleep(1*time.Second)
m.RUnlock()
println(i,"read over")
}
func write(i int) {
println(i,"write start")
m.Lock()
println(i,"writing")
time.Sleep(1*time.Second)
m.Unlock()
println(i,"write over")
}
1 write start
1 writing
2 read start
3 write start
1 writing over
2 reading
2 read over
3 writing
3 write over
可以看出写锁会对于读锁进行阻碍 在写锁的时候进入不到读锁
标签:RWMutex,start,read,over,sync,println,读锁,time,Go 来源: https://blog.csdn.net/fujian9544/article/details/100538286
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。