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

学建设网站及功能百度小说风云榜

学建设网站及功能,百度小说风云榜,javaweb是什么意思,org域名注册条件文章目录背景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.yidumall.com/news/23490.html

相关文章:

  • 郑州门户网站建设北京营销推广网站建设
  • 杭州 城西 做网站如何在各大网站发布信息
  • 株洲网站制作公司有哪些百度网盘搜索
  • 阿里云部署多个网站百度权重排名
  • 国内电商网站html源码专业拓客公司联系方式
  • 石狮制作网站推广策略可以分为哪三种
  • dedecms做企业网站百度移动端关键词优化
  • 注册城乡规划师培训机构武汉seo网站管理
  • 黄冈做网站技术支持的360优化大师最新版
  • 安阳网站制作优化培训学校机构有哪些
  • 移动端网站开发尺寸东莞疫情最新消息今天新增
  • 电子商务网站开发与实现怎么做线上推广
  • 政府网站建设费用明细站长工具网站排名
  • 网站被攻击了怎么处理最新新闻热点素材
  • 手机做网站服务器自己开网店怎么运营
  • 网站建设公司招聘企业类网站有哪些例子
  • 做网站的数据库2022适合小学生的简短新闻摘抄
  • 网站开发经理具备什么知识百度seo报价
  • 出口网站怎么做上海最新事件
  • 只做外贸的公司网站视频广告接单平台
  • 自己如何建设个网站网站生成app工具
  • 网站模板带后台 下载培训推广 seo
  • wordpress批量添加图片链接保定seo排名
  • 金阊做网站价格有利于seo优化的是
  • 手机wap网站开发与设计最近一周新闻热点大事件
  • 摄影网站制作软件新乡网站优化公司价格
  • 北京定制网站开发公司网站提交入口
  • 企业查官网关键词优化工具互点
  • 潍坊网站建设中公成人职业技能培训班
  • 义乌小程序开发黑帽seo365t技术