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

辅助购卡网站怎么做搜狗网站提交入口

辅助购卡网站怎么做,搜狗网站提交入口,具有品牌的做pc端网站,北京怎样做网站推广一、互斥锁 先看一个并发情况,同时操作一个全局变量,如果没有锁会怎么样 假设有1000个goroutines并发进行银行余额的扣除,每次都扣除10元,起始的总余额是10000,理论上并发执行完应该是0对不对,但实际却不…

一、互斥锁

先看一个并发情况,同时操作一个全局变量,如果没有锁会怎么样

假设有1000个goroutines并发进行银行余额的扣除,每次都扣除10元,起始的总余额是10000,理论上并发执行完应该是0对不对,但实际却不是

import ("fmt""sync"
)var balance uint = 10000func withdraw(amount uint) {balance = balance - amountfmt.Println("剩余存款:", balance)defer wg.Done()
}func getBalance() uint {return balance
}func main() {for i := 1; i <= 1000; i++ {wg.Add(1)go withdraw(10)}wg.Wait()fmt.Println(getBalance())
}

得到的结果如下:

这时候就需要引入一个锁来保护balance全局变量,在并发goroutines执行的情况下,防止其他goroutines获取到balance变量进行操作(其他goroutines会处于等待锁的状态)

import ("fmt""sync"
)var balance uint = 10000
var mu sync.Mutex
var wg sync.WaitGroupfunc withdraw(amount uint) {//如果其它的goroutine已经获得了这个锁的话,这个操作会被阻塞直到其它goroutine调用了Unlock使该锁变回可用状态。mutex会保护共享变量。mu.Lock()                       ******************* 增加锁 **********************balance = balance - amountfmt.Println("剩余存款:", balance)mu.Unlock()                     ******************* 释放锁 **********************defer wg.Done()
}func getBalance() uint {return balance
}func main() {for i := 1; i <= 1000; i++ {wg.Add(1)go withdraw(10)}wg.Wait()fmt.Println(getBalance())
}

得到的结果如下:

二、读写锁

RWMutex,即读写互斥锁,适用于读操作远远多于写操作的场景,当多个goroutine需要频繁地读取某个共享资源,而写入操作相对较少时,使用RWMutex可以提高并发性能。

func getBalance() uint {rwMu.RLock()               *********  加锁读取 ********defer rwMu.RUnlock()       ********* 返回释放锁 ********return balance
}

原理:RWMutex允许多个goroutine同时获取读锁(RLock),进行并发读操作,而写锁(Lock)则是互斥的,同一时间只允许一个goroutine进行写操作。当一个goroutine获取读锁时,其他goroutine也可以继续获取读锁来读取数据,而不需要等待。只有当有goroutine尝试获取写锁时,读锁才会被阻塞,这样可以有效地提高并发读取的效率。

sync.RWMutex锁的设计就是为了优化读操作频繁的场景。它能够区分读锁(RLock)和写锁(Lock)

读锁(RLock):
当一个goroutine需要读取共享资源时,它会尝试获取读锁。如果当前没有其他goroutine持有写锁,那么它可以成功获取读锁,并且可以并发地读取数据。如果有其他goroutine已经持有读锁,新的读锁请求也会被允许,从而允许多个goroutine同时读取。

写锁(Lock):
当一个goroutine需要写入共享资源时,它会尝试获取写锁。在写锁被获取之前,所有的读锁和写锁请求都会被阻塞。这意味着,一旦有goroutine开始写操作,其他想要读取或写入的goroutine都必须等待,直到写操作完成并且写锁被释放。

锁的释放:
当一个goroutine完成读取或写入操作后,它会释放相应的锁。如果是读操作完成,它会释放读锁,这样其他正在等待的goroutine就可以获取读锁并开始读取。如果是写操作完成,它会释放写锁,这样其他正在等待的读锁或写锁请求就可以继续进行。

RWMutex的这种设计使得在读操作远多于写操作的情况下,可以提高程序的并发性能。因为多个goroutine可以同时读取,而不需要等待写操作完成,这样就减少了锁竞争,提高了整体的吞吐量。然而,需要注意的是,RWMutex并不是在所有情况下都能提高性能。如果写操作非常频繁,或者读写操作几乎同等频繁,使用RWMutex可能会导致性能下降,因为写操作会阻塞所有读锁和写锁的请求。在这种情况下,使用Mutex可能会更加合适。

http://www.tj-hxxt.cn/news/117474.html

相关文章:

  • iis上做的网站外网怎么访问不了google seo怎么优化
  • 网站的底部导航栏怎么做友点企业网站管理系统
  • 厦门谁需要网站建设国家免费职业培训平台
  • html5国内网站建设新闻实时报道
  • 南宁网站建设 南宁联达亿东莞网络营销推广软件
  • 专业seo网站网站推广平台有哪些
  • 大良网站智能推广价格长春视频剪辑培训机构
  • 做外贸网站推广最近发生的热点事件
  • 在线定制seo提升关键词排名
  • 公司网站设计的费用优化大师有必要安装吗
  • 网站开发的毕业论文线下推广方式有哪些
  • 免费软件app网站下载大全网站seo优化教程
  • wordpress页面编辑插件网站优化推广seo公司
  • 请seo的人帮做网站排名bt磁力狗
  • 杨浦做网站chatgpt网址
  • 做兼职什么网站站长统计幸福宝下载
  • 深圳龙岗网站建设手机版怎么用百度快照
  • 山东省市建设委员会网站大连百度seo
  • 公司的网站建设费用属于什么费新浪微博指数查询
  • 西安做网站程序网络营销属于什么专业类型
  • 泉州seo-泉州网站建设公司seo技术培训教程视频
  • 建设银行网站解除绑定全球疫情最新数据统计
  • 微信端网站设计苏州seo关键词优化价格
  • 社交网站盈利吗东莞做网站的联系电话
  • 那个网站做的调查准确淘宝店铺运营
  • 自己做的网站 打开了没有图片网络营销的含义
  • 地方门户网站还能做吗百度权重
  • 做企业网站的软件开发交易平台
  • 中国制造网网站特色百度一下百度一下你知道
  • 海安做网站建立网站步骤