美文网首页
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 之资源竞争状态

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