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

黄州做网站的网站建站所用的技术

黄州做网站的,网站建站所用的技术,化妆品购物网站模板,自己做网站怎么选架构我先声明一下#xff0c;并不是真的加锁失效#xff0c;而是我之前的理解有误#xff0c;导致看起来像是加锁失效一样。于是乎记录一下#xff0c;加深一下印象。 我之前有个理解误区#xff08;不知道大家有没有#xff0c;有的话赶紧纠正一下——其实也是因为我这块的…我先声明一下并不是真的加锁失效而是我之前的理解有误导致看起来像是加锁失效一样。于是乎记录一下加深一下印象。 我之前有个理解误区不知道大家有没有有的话赶紧纠正一下——其实也是因为我这块的知识掌握不牢固导致的觉得只要是加锁后在我主动调用解锁之前这个块范围内的变量一定不会被其他地方修改。后来验证发现我大错特错了。 起因 最近在学习 sync.Mutex 加锁时写了下面一段代码进行练习。 package mainimport (fmtsynctime )type Info struct {mu sync.MutexValue string }func Update(info *Info) {fmt.Printf(%s: before update. Value: %s\n, time.Now().Format(timeFormat), info.Value)info.mu.Lock()defer info.mu.Unlock()time.Sleep(2 * time.Second)fmt.Printf(%s: in update. Value: %s\n, time.Now().Format(timeFormat), info.Value)info.Value updatefmt.Printf(%s: after update. Value: %s\n, time.Now().Format(timeFormat), info.Value) }const timeFormat 2006-01-02 15:04:05func main() {fmt.Printf(%s: main start\n, time.Now().Format(timeFormat))info : Info{}var wg sync.WaitGroupwg.Add(1)go func() {defer wg.Done()Update(info)}()time.Sleep(time.Second)info.Value mainfmt.Printf(%s: in main. Value: %s\n, time.Now().Format(timeFormat), info.Value)wg.Wait() }按照我原先上面的理解Update() 函数当中before update 和 in update 中对应结构体的值应该是不会变的毕竟我加了锁。然而从运行结果发现Update() 函数执行期间结构体变量的 Value 竟然还是被外部主线程修改了。 分析 那么为什么会这样呢明明 Update() 里边已经添加了锁为什么执行期间还是会被其他地方修改呢 最后发现究其原因还是在于主线程修改变量的值的时候没有先判断锁 mu 是否已经释放就直接进行了修改操作。 主线程中加上获取锁的操作后会先判断当前锁是否被释放如果没被释放就会一直进行等待直到锁释放后才继续执行后面的操作。 输出结果也和预期保持一致 。 2024-04-16 23:59:13: main start 2024-04-16 23:59:13: before update. Value: 2024-04-16 23:59:15: in update. Value: 2024-04-16 23:59:15: after update. Value: update 2024-04-16 23:59:15: in main. Value: main 正常来说锁是要配合多 goroutine 来使用的 对于单线程来说由于没有其他线程进行资源竞争加锁的意义不大对于多 goroutine 而言对于获取和释放锁的时机应该由应用程序合理控制。关于锁的使用还有一些其他注意事项这块也一并写一下。 在一个 goroutine 获得 Mutex 后其他 goroutine 只能等到这个 goroutine 释放该 Mutex使用 Lock() 加锁后不能再继续对其加锁直到利用 Unlock() 解锁后才能再加锁在 Lock() 之前使用 Unlock() 会导致 panic 异常已经锁定的 Mutex 并不与特定的 goroutine 相关联这样可以利用一个 goroutine 对其加锁再利用其他 goroutine 对其解锁在同一个 goroutine 中的 Mutex 解锁之前再次进行加锁会导致死锁适用于读写不确定并且只有一个读或者写的场景 缓冲通道实现互斥逻辑 当然我们还可以通过缓冲为1的通道实现互斥锁的逻辑。 package mainimport (fmtsynctime )type Info struct {Value string }func Update(info *Info, sem chan bool) {fmt.Printf(%s: before update. Value: %s\n, time.Now().Format(timeFormat), info.Value)sem - truedefer func() {- sem}()time.Sleep(2 * time.Second)fmt.Printf(%s: in update. Value: %s\n, time.Now().Format(timeFormat), info.Value)info.Value updatefmt.Printf(%s: after update. Value: %s\n, time.Now().Format(timeFormat), info.Value) }const timeFormat 2006-01-02 15:04:05func main() {sem : make(chan bool, 1)fmt.Printf(%s: main start\n, time.Now().Format(timeFormat))info : Info{}var wg sync.WaitGroupwg.Add(1)go func() {defer wg.Done()Update(info, sem)}()time.Sleep(time.Second)sem - trueinfo.Value mainfmt.Printf(%s: in main. Value: %s\n, time.Now().Format(timeFormat), info.Value)- semwg.Wait() }2024-04-17 00:26:25: main start 2024-04-17 00:26:25: before update. Value: 2024-04-17 00:26:26: in main. Value: main 2024-04-17 00:26:27: in update. Value: main 2024-04-17 00:26:27: after update. Value: update
http://www.pierceye.com/news/39371/

相关文章:

  • heritrix做网站高端品牌女装特价网
  • 免费的网站域名申请完整域名展示网站源码
  • 建设工程网站单位名单计算机类17个专业
  • 怎么用家里的电脑做网站服务器百度投诉中心人工电话
  • 漳州企业网站建设制作新手怎么推广自己的店铺
  • 个人备案网站可以做淘宝客网站建设需要度搜去
  • 网站建设及空间考研哪个培训机构比较好
  • 南京太阳宫网站建设佛山网站建设招标
  • 网站开发游戏程序开发二次元动漫网站设计方案
  • 最常见企业网站公司有哪些做坑网站需要
  • 惠阳有做公司网站的吗最好设计网站建设
  • 网站制作:网推宝|百度比较公司网站与营销网站的不同
  • 网站建设 义乌北京市建设集团有限公司
  • 百度网站抓取一件代发应该在哪个网站上做
  • app介绍类网站模板做投标网站条件
  • 宁波网站建设公司哪里有一级网站建设
  • 网站版面特点做网站可以赚钱嘛
  • 网站建设需求表模板做网站违法吗
  • 网站无域名注册人id电视台网站建设
  • 深圳专业网站建设公深圳龙岗区住房和建设局网站官网
  • 北京网站优化技术网站制作留钱
  • 公司网站服务器选择发果怎么做视频网站
  • 怎么可以上传自己做的网站网络系统运维
  • 线上注册公司是在哪个网站专业网站制作推荐
  • 网站开发环境与工具企业网站优化方案
  • 专门做调查问卷的网站深圳宝安区区号
  • 建设营销型网站服务wordpress sns主题
  • 建设通招标网站购买一个网站需要多少钱?
  • 南昌网站推广贵州省城乡和住房建设厅网站首页
  • 如何做网站动态图标深圳市seo网站设计