Go 之资源竞争状态

2017-04-16  本文已影响0人  大植先生

竞争状态:

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

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

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

竞争状态示例程序:

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

运行结果:

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

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

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

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

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

上一篇下一篇

猜你喜欢

热点阅读