当前位置: 首页 > news >正文

学建设网站及功能网络开发

学建设网站及功能,网络开发,高端衣服网购平台,统计wordpress文章目录背景RWMutex 简介代码验证多个协程请求读锁 RLock() 和 RLock()读写交错 RLock() 和 Lock()写入的时候读取读取的时候写入请求多个写Lock() 和 Lock()背景 Mutex 互斥锁是严格锁定读和写,如果我们需要单独对读或者写添加锁需要使用 sync包的RWMutex 针对读…

文章目录

    • 背景
    • RWMutex 简介
    • 代码验证
      • 多个协程请求读锁 `RLock()` 和 `RLock()`
      • 读写交错 `RLock()` 和 `Lock()`
        • 写入的时候读取
        • 读取的时候写入
      • 请求多个写`Lock()` 和 `Lock()`

背景

Mutex 互斥锁是严格锁定读和写,如果我们需要单独对读或者写添加锁需要使用 sync包的RWMutex
针对读多写少的情况:

读写锁的原则是
1、可以随便读,多个协程同时读。
2、写的时候,不能读也不能写。

RWMutex 简介

RWMutex 类型一共有 6 个方法,

RLock/RUnlock:RLock 锁定读操作,如果锁已被写操作持有,RLock 方法会被阻塞,直到锁释放;如果锁已被读操作持有,则无限制,可以读取内容。RUnlock 是读操作对应的释放锁的方法。

Lock/Unlock:Lock 锁定读写操作,不管是读操作持有锁,还是写操作持有锁,Lock 方法都会被阻塞,直到锁释放。Unlock 是对应的释放锁方法。一般用于写操作的场景。

rUnlockSlow:检查读操作是否全部释放锁,如果读锁全部释放,才可以唤醒写操作去请求写锁。

RLocker:RLocker 为读操作返回一个 Locker 接口,它的 Lock 方法会调用 RWMutex 类型的 RLock方法,它的 Unlock 方法会调用 RWMutex 类型的 RUnlock方法。

其中 RLock()RLock() 之间并不互斥,可以共享锁,Lock()Lock() 之间还有 RLock()Lock() 之间是互斥的.

代码验证

多个协程请求读锁 RLock()RLock()


package mainimport ("fmt""time""sync"
)// 声明Mutex变量
var mu *sync.RWMutex
var count = 0
func main() {mu = new(sync.RWMutex)for i:= 0; i< 1000; i++ {go readLock(i)}time.Sleep(2*time.Second)
}func readLock(i int) {mu.RLock()count++fmt.Println(i," Read Lock is", count)mu.RUnlock()
}

在这里插入图片描述

如上代码所示, 我们启动1000个协程,每个协程执行的readLock 中都添加了 RLock(). 执行结果如下:

结果发现,count 数字打印杂乱无章,说明这些协程同时持有锁,多个RLock() 之间并不互斥。

读写交错 RLock()Lock()

写入的时候读取


package mainimport ("fmt""time""sync"
)// 声明Mutex变量
var mu *sync.RWMutex
var count = 0
func main() {mu = new(sync.RWMutex)for i := 0; i< 5; i++ {go readLock(1)}for i := 0; i< 5; i++ {go writLock(1)}time.Sleep(30*time.Second)
}func writLock(i int){mu.Lock()fmt.Println(i," Writ Lock start", count)count++fmt.Println(i," Writ Lock is", count)time.Sleep(1 *time.Second)fmt.Println(i," Writ Lock done", count)mu.Unlock()
}func readLock(i int) {mu.RLock()fmt.Println(i," Read Lock is", count)// time.Sleep(10 *time.Second)fmt.Println(i," Read Lock done")mu.RUnlock()
}

Lock() 写入的时候,sleep 期间, 使用 RLock() 读取, 结果如下
在这里插入图片描述
发现在 write 等待的时候 read 并没有获得锁, 说明 Lock() 锁未释放, RLock() 不能获得锁

读取的时候写入


package mainimport ("fmt""time""sync"
)// 声明Mutex变量
var mu *sync.RWMutex
var count = 0
func main() {mu = new(sync.RWMutex)for i := 0; i< 10; i++ {go readLock(1)}for i := 0; i< 10; i++ {go writLock(1)}time.Sleep(15*time.Second)
}func writLock(i int){mu.Lock()fmt.Println(i," Writ Lock start", count)count++fmt.Println(i," Writ Lock is", count)// time.Sleep(1 *time.Second)fmt.Println(i," Writ Lock done", count)mu.Unlock()
}func readLock(i int) {mu.RLock()fmt.Println(i," Read Lock is", count)time.Sleep(10 *time.Second)fmt.Println(i," Read Lock done")mu.RUnlock()
}

RLock() sleep 期间, 使用 Lock() 结果如下

在这里插入图片描述
read 期间, writ 并没有获得锁。 证明了 RLock()Lock() 是互斥的。

请求多个写Lock()Lock()


package mainimport ("fmt""time""sync"
)// 声明Mutex变量
var mu *sync.RWMutex
var count = 0
func main() {mu = new(sync.RWMutex)for i:= 0; i< 1000; i++ {go writLock(i)}time.Sleep(2*time.Second)
}func writLock(i int){mu.Lock()count++fmt.Println(i," Writ Lock is", count)mu.Unlock()
}

启动1000个线程, 使用 Lock() 执行 count ++, 结果如下
在这里插入图片描述
发现最红结果是1000,并且是按照顺序进行计算的。 说明多个协程之间的Lock() 是互斥的。

http://www.mmbaike.com/news/93309.html

相关文章:

  • 宝马的高端品牌叫什么seo分析
  • 滨湖区知名做网站价格网站ip查询
  • a站全称重庆百度关键词优化软件
  • 用html5做课程教学网站网页模板免费下载
  • 什么网站可以免费做视频软件自己如何开网站
  • 南宁网站推广google推广技巧
  • 做购物网站多少钱 知乎六安seo
  • 网站建设人才有哪些个人如何加入百度推广
  • 城乡建设门户网站比较好的网站建设网站
  • 直通车代运营如何结合搜索检索与seo推广
  • 股票跟单网站开发百度手机助手app免费下载
  • 重庆做网站哪家好杭州网站推广公司
  • 成都网站建设cdajcx中国做网站的公司排名
  • 企业网站开发公司有哪些seo成功的案例和分析
  • app store下载苹果版福州关键词排名优化
  • 昆明网站建设哪个好2024年疫情还会封控吗
  • 大石桥网站建设公司百度视频广告怎么投放
  • 怎样做旅游城市住宿网站搜索引擎优化大致包含哪些内容或环节
  • 网站建设推广安徽360优化大师下载官网
  • 唯美网站建设网站seo排名公司
  • 网站ui设计给用户提交什么合肥seo报价
  • 教育培训网站模板如何做网络推广外包
  • 可以做软文推广的网站seo怎么发布外链
  • 用.net做的网站吗软文广告文案案例
  • 免费网站推广在线观看网站系统开发
  • 龙岗外贸网站制作推广普通话宣传内容
  • 上海网站建设上海网站制作荥阳网站优化公司
  • wordpress 站内链接软文推广有哪些
  • 卖设备用哪个网站百度站长快速收录
  • 个人做百度云下载网站百度网址大全旧版