美文网首页
Go 之资源竞争状态

Go 之资源竞争状态

作者: 大植先生 | 来源:发表于2017-04-16 09:31 被阅读0次

竞争状态:

如果两个或者多个 goroutine 在没有互相同步的情况下,访问某个共享资源,并试图同时读和写这个资源,就处于相互竞争的状态。

这种状态让并发程序变得复杂,容易引起潜在问题。

对于一个共享资源的读和写操作必须是原子化的,也就是同一时刻只能有一个 goroutine 对共享资源进行读和写操作。

竞争状态示例程序:

    //实际上并不希望出现这种情况

运行结果:

我们知道变量 counter 会进行4次读和写操作,每个 goroutine 执行两次。但是程序终止时,counter变量的值为2.

造成这种原因是因为:每个 goroutine 都会覆盖另一个 goroutine 的工作。这种覆盖发生在 goroutine 切换的时候。每个 goroutine 创造了一个 counter 变量的副本,之后就切换到另一个 goroutine 。当这个 goroutine 再次运行时,counter变量的值已经改变了,但是 goroutine 并没有更新自己的那个副本的值,而是继续使用这个副本的值,用这个值递增,并存回 counter 变量,结果覆盖了另一个 goroutine 完成的工作。

所以,我们应该修正代码。

一种修正代码、消除竞争状态的办法是,使用Go语言提供的锁机制,来锁住共享资源,从而保证 goroutine 的同步状态。

下一节将会讲到......

相关文章

  • Go 之资源竞争状态

    竞争状态: 如果两个或者多个 goroutine 在没有互相同步的情况下,访问某个共享资源,并试图同时读和写这个资...

  • Go语言 sync.Mutex 源码分析

    go 语言以并发作为其特性之一,并发必然会带来对于资源的竞争,这时候我们就需要使用 go 提供的 sync.Mut...

  • 源码剖析golang中sync.Mutex

    go语言以并发作为其特性之一,并发必然会带来对于资源的竞争,这时候我们就需要使用go提供的sync.Mutex这把...

  • Go语言实战笔记(十三)| Go 并发资源竞争

    《Go语言实战》读书笔记,未完待续,欢迎扫码关注公众号flysnow_org,第一时间看后续笔记。觉得有帮助的话,...

  • 竞争状态

    有并发,就有资源竞争,如果两个或者多个 goroutine 在没有相互同步的情况下,访问某个共享的资源,比如同时对...

  • goalng1.14不同场景下sync.Map、Mutex、RW

    因为使用go过程中会经常使用map存储,多个goroutine会出现资源竞争的问题,所以写个demo测试一下不同方...

  • 无标题文章

    关系是资源,人类的竞争分为表象的竞争与实质的竞争,表象的竞争是资源的竞争,实质的竞争是关系的竞争。表象的竞争是传统...

  • go 并发安全

    竞争状态 如果多个goroutine在没有相互同步的情况下,访问某个共享的资源,并试图同时读和写这个资源,就处于相...

  • 音视频开发:OpenGL 多线程同步方案

    OpenGL 由于状态机这个桎梏,天然是适合单线程渲染的。由于状态机中的状态、资源、内存无法解决多线程中的竞争问题...

  • Go race 数据竞争检测

    WEB服务 main.go goods.go 增加 列表 go 启动增加参数 race,检测数据竞争 执行imag...

网友评论

      本文标题:Go 之资源竞争状态

      本文链接:https://www.haomeiwen.com/subject/ftxaattx.html