目录
一、并发机制
1、非线程安全
package share_mem
import (
"fmt"
"sync"
"testing"
"time"
)
//线程不安全计数器
func TestCounter(t *testing.T) {
var counter int
for i := 0; i < 5000; i++ {
go func() {
counter++
}()
}
//这里等一秒是因为我们不知道所有的协程执行完毕需要多久,
//防止主程序已经退出了,协程还没执行完导致结果不准确,后面会介绍更好的处理方案。
time.Sleep(time.Second * 1)
fmt.Printf("counter=%d\n", counter)
}
/*
可以看到下面的执行结果,counter 并不等于 5000
=== RUN TestCounter
counter=4775
--- PASS: TestCounter (1.01s)
PASS
*/
当我们不使用锁的机制来使用协程时,counter 变量在不同的协程里面去做自增,导致了并发时锁的竞争,丢失了很多正确的写操作,即不是一个线程安全的程序。
2、线程安全
那么我们现在就要对这个共享内存做一个线程保护