从零开始学Go之并发(四):互斥
通常使用互斥锁(Mutex)这一数据结构来保证每次只有一个 Go 程能够访问一个共享的变量
sync.Mutex:
Go 标准库中提供了 sync.Mutex
互斥锁类型及其两个方法:
Lock()
Unlock()
我们可以通过在代码前调用Lock方法,在代码后调用Unlock方法来保证一段代码的互斥执行
用defer语句来保证互斥锁一定会被解锁
// SafeCounter 的并发使用是安全的。 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() // Lock 之后同一时刻只有一个 goroutine 能访问 c.v defer c.mux.Unlock() return c.v[key] } func main() { c := SafeCounter{v: make(map[string]int)} for i := 0; i < 1000; i++ { go c.Inc("somekey") } time.Sleep(time.Second) fmt.Println(c.Value("somekey")) }
运行结果:
1000
所有资料与参考来源:
Go语言入门教程:http://c.biancheng.net/golang/