使用go来访问共享变量避免冲突的时候可以用 sync.Mutex这个类型,其中的Lock和Unlok方法可以保证在使用该变量的时候只能有一个进程可以访问该变量,从而避免冲突。 (其实就是实现互斥
package main
import (
"fmt"
"sync"
"time"
)
type SafeCounter struct {
v map[string]int
// 互斥锁类型,拥有两个方法
mux sync.Mutex
}
// Inc增加给定key的计数器的值
func (c *SafeCounter) Inc(key string) {
c.mux.Lock()
//Lock之后同一时刻只能有一个goroutine能访问c.v
c.v[key]++
c.mux.Unlock()
}
// Value返回给定key的计数器的当前值
func (c *SafeCounter) Value(key string) int {
c.mux.Lock()
// 用defer来保证互斥锁一定会被解锁
defer c.mux.Unlock()
return c.v[key]
}
func main() {
c := SafeCounter{v: make(map[string]int)}
for i := 0; i < 10000000; i++ {
go c.Inc("somekey")
}
//感觉这一句没啥用啊,为啥要写在这,让go程睡一会儿吗
// 但是上面的go程已经执行完了啊
// time.Sleep(5 * time.Millisecond)
//注释掉以后发现这句时必须的,不然的话没法每次输出的值都不一样
// 据说time.Tick可代替time.Sleep
time.Tick(50 * time.Millisecond)
// 输出有多少个"somekey"
fmt.Println(c.Value("somekey"))
fmt.Println(c.v) //ouput: map[somekey:10000000]
}