内容简介:一、介绍sync.RWMutex 为读写锁,lock为写锁定 ,Unlock 为写解锁,RLock为读锁,RUnlock为读解锁。二、场景
一、介绍
sync.RWMutex 为读写锁,lock为写锁定 ,Unlock 为写解锁,RLock为读锁,RUnlock为读解锁。
二、场景
适用于场景:多读一写,读可以同时进行,但是写只能一个写,读写是互斥的要么只能读或者只能写
三、代码测试
功能性测试
第一种场景 测试内容 : 读锁存在的情况下,同时出现读和写的操作,此时优先获取写锁
package main import ( "testing" "fmt" "sync" "time" ) var rwlock = &sync.RWMutex{} var wg = &sync.WaitGroup{} func TestRWMutex(t *testing.T) { //读 wg.Add(1) go rlockwork() time.Sleep(2 * time.Second) //读 wg.Add(1) go rlock() //写 wg.Add(1) go wlock() wg.Wait() } func wlock() { rwlock.Lock() fmt.Println("加写锁") fmt.Println("写任务执行") defer func() { rwlock.Unlock() fmt.Println("最后写解锁完毕") wg.Done() }() fmt.Println("准备解开写锁") } func rlock() { rwlock.RLock() fmt.Println("加读锁") fmt.Println("读任务执行") defer func() { rwlock.RUnlock() fmt.Println("最后读解锁完毕") wg.Done() }() fmt.Println("准备解开读锁") } func rlockwork() { rwlock.RLock() fmt.Println("加读锁====首先获取读锁") fmt.Println("读任务执行") time.Sleep(4 * time.Second) defer func() { rwlock.RUnlock() fmt.Println("最后读解锁完毕") wg.Done() }() fmt.Println("准备解开读锁") }
输出结果:
=== RUN TestRWMutex 加读锁====首先获取读锁 读任务执行 准备解开读锁 最后读解锁完毕 加写锁 写任务执行 准备解开写锁 最后写解锁完毕 加读锁 读任务执行 准备解开读锁 最后读解锁完毕 --- PASS: TestRWMutex (4.00s) PASS Process finished with exit code 0
第二种场景 功能性测试
测试内容: 同时开启2个线程去争夺读锁和写锁,此时都有机会被获取
package main import ( "testing" "fmt" "sync" "time" ) var rwlock = &sync.RWMutex{} var wg = &sync.WaitGroup{} func TestRWMutex(t *testing.T) { //读 //wg.Add(1) //go rlockwork() time.Sleep(2 * time.Second) //读 wg.Add(1) go rlock() //写 wg.Add(1) go wlock() wg.Wait() } func wlock() { rwlock.Lock() fmt.Println("加写锁") fmt.Println("写任务执行") defer func() { rwlock.Unlock() fmt.Println("最后写解锁完毕") wg.Done() }() fmt.Println("准备解开写锁") } func rlock() { rwlock.RLock() fmt.Println("加读锁") fmt.Println("读任务执行") defer func() { rwlock.RUnlock() fmt.Println("最后读解锁完毕") wg.Done() }() fmt.Println("准备解开读锁") } func rlockwork() { rwlock.RLock() fmt.Println("加读锁====首先获取读锁") fmt.Println("读任务执行") time.Sleep(4 * time.Second) defer func() { rwlock.RUnlock() fmt.Println("最后读解锁完毕") wg.Done() }() fmt.Println("准备解开读锁") }
输出结果:
=== RUN TestRWMutex 加写锁 写任务执行 准备解开写锁 最后写解锁完毕 加读锁 读任务执行 准备解开读锁 最后读解锁完毕 --- PASS: TestRWMutex (2.00s) PASS Process finished with exit code 0 分割线======================================分割线 === RUN TestRWMutex 加读锁 读任务执行 准备解开读锁 最后读解锁完毕 加写锁 写任务执行 准备解开写锁 最后写解锁完毕 --- PASS: TestRWMutex (2.00s) PASS Process finished with exit code 0
第三种场景 功能性测试
测试内容:写锁存在的情况,同时开启2个线程去争夺读锁和写锁,优先获取读锁
package main import ( "testing" "fmt" "sync" "time" "runtime" ) var rwlock = &sync.RWMutex{} var wg = &sync.WaitGroup{} func TestRWMutex(t *testing.T) { //写 runtime.GOMAXPROCS(runtime.NumCPU()) wg.Add(1) go wlock() time.Sleep(2 * time.Second) //读 wg.Add(1) go rlock() //写 wg.Add(1) go wlock() wg.Wait() } func wlock() { rwlock.Lock() fmt.Println("加写锁") fmt.Println("写任务执行") time.Sleep(4 * time.Second) defer func() { rwlock.Unlock() fmt.Println("最后写解锁完毕") wg.Done() }() fmt.Println("准备解开写锁") } func rlock() { rwlock.RLock() fmt.Println("加读锁") fmt.Println("读任务执行") defer func() { rwlock.RUnlock() fmt.Println("最后读解锁完毕") wg.Done() }() fmt.Println("准备解开读锁") } func rlockwork() { rwlock.RLock() fmt.Println("加读锁====首先获取读锁") fmt.Println("读任务执行") //time.Sleep(4 * time.Second) defer func() { rwlock.RUnlock() fmt.Println("最后读解锁完毕") wg.Done() }() fmt.Println("准备解开读锁") }
输出结果:
=== RUN TestRWMutex 加写锁 写任务执行 准备解开写锁 最后写解锁完毕 加读锁 读任务执行 准备解开读锁 最后读解锁完毕 加写锁 写任务执行 准备解开写锁 最后写解锁完毕 --- PASS: TestRWMutex (8.01s) PASS Process finished with exit code 0
总结:
1.读锁存在的情况下,同时出现读和写的操作,此时优先获取写锁
2.同时开启2个线程去争夺读锁和写锁,此时都有机会被获取
3.写锁存在的情况,同时开启2个线程去争夺读锁和写锁,优先获取读锁
注:(golang版本go version go1.11.4 darwin/amd64)
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网
猜你喜欢:- Golang并发:一招掌握无阻塞通道读写
- Golang 并发编程之互斥锁、读写锁详解
- Java 多线程并发读写锁 ReadWriteLock 实现原理剖析
- 并发 Go 程序中的共享变量 (三):读写锁
- Java并发编程笔记之读写锁 ReentrantReadWriteLock 1.8 原理
- HDFS NameNode 高并发数据读写架构及QJM选举深入研究
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
网络营销实战密码
昝辉Zac / 电子工业出版社 / 2009.1 / 56.00元
本书是作者几年来网络营销实战的总结,与其他网络营销书籍最大不同之处是:只专注于实战,不谈理论。本书分三部分详细介绍了网络营销实用策略和技巧,并分析了大量实战案例。第一部分介绍市场与产品研究,包括用户、市场和竞争对手的调查;产品、目标市场的确定;价格策略;赢利模式等。第二部分讨论以网络营销为导向的网站设计,包括怎样在网站上卖东西、提高转化率,以及网站目标设定等。第三部分研究怎样给网站带来流量,详细讨......一起来看看 《网络营销实战密码》 这本书的介绍吧!