📅  最后修改于: 2021-01-02 09:09:53             🧑  作者: Mango
当两个或更多goroutine尝试访问同一资源时,Go中就会出现竞争条件。当变量在不考虑其他例程的情况下尝试读取和写入资源时,可能会发生这种情况。
package main
import (
"sync"
"time"
"math/rand"
"fmt"
)
var wait sync.WaitGroup
var count int
func increment(s string) {
for i :=0;i<10;i++ {
x := count
x++;
time.Sleep(time.Duration(rand.Intn(4))*time.Millisecond)
count = x;
fmt.Println(s, i,"Count: ",count)
}
wait.Done()
}
func main(){
wait.Add(2)
go increment("foo: ")
go increment("bar: ")
wait.Wait()
fmt.Println("last count value " ,count)
}
输出:
foo: 0 Count: 1
bar: 0 Count: 1
foo: 1 Count: 2
foo: 2 Count: 3
foo: 3 Count: 4
bar: 1 Count: 2
foo: 4 Count: 5
foo: 5 Count: 6
foo: 6 Count: 7
bar: 2 Count: 3
bar: 3 Count: 4
bar: 4 Count: 5
foo: 7 Count: 8
foo: 8 Count: 9
bar: 5 Count: 6
bar: 6 Count: 7
foo: 9 Count: 10
bar: 7 Count: 8
bar: 8 Count: 9
bar: 9 Count: 10
last count value 10
如您在上面的示例中看到的,计数资源由2个go例程访问。每个例程迭代10次。在这种情况下,count变量最后应为20。并非如此,因为它是在模拟比赛条件。