使用go来访问共享变量避免冲突的时候可以用 sync.Mutex这个类型,其中的Lock和Unlok方法可以保证在使用该变量的时候只能有一个进程可以访问该变量,从而避免冲突。 (其实就是实现互斥
package mainimport ("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.vc.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.Sleeptime.Tick(50 * time.Millisecond)// 输出有多少个"somekey"fmt.Println(c.Value("somekey"))fmt.Println(c.v) //ouput: map[somekey:10000000]}
