Go 并发编程 - 案例 1: 计数器怎么不对?

...

Concurrent Programming = 并发编程

现有一个计数器初始值为 0, 但有 10000 个人来一起累加. 会发生点什么?

// case1_test.go
package case1

import (
	"testing"
	"time"
)

func TestCase1(t *testing.T)  {
	counter := 0
	for i := 0; i < 10000; i++{
		go func() {
			counter++
		}()
	}
	time.Sleep(3 * time.Second)
	t.Logf("counter = %d", counter)
}

你会发现最后计数器的值总是小于 10000, 那么怎么就丢失了一部分数据呢?

究其原因:
协程并发执行时, 产生了竞态条件, 导致数据的乱入.
这也是我们通常所说的非线程安全 (这里用非协程安全或许更适合.)

posted @ 2020-03-10 17:06  taadis  阅读(...)  评论(...编辑  收藏