Go互斥锁

【Go互斥锁】互斥锁或互斥量可用于同步对状态的访问, 并跨许多goroutine安全地访问数据。它充当代码关键部分入口的防护, 因此一次只能有一个线程进入关键部分。
我们用它围绕特定的代码行设置了一个锁。当一个Goroutine持有锁时, 所有其他Goroutine都被阻止执行受同一互斥锁保护的任何代码行, 并被迫等待直到产生锁之后才能继续执行。
Go Mutex示例

package mainimport ("sync""time""math/rand""fmt")var wait sync.WaitGroupvar count intvar mutex sync.Mutexfuncincrement(s string){for i :=0; i< 10; i++ {mutex.Lock()x := countx++; time.Sleep(time.Duration(rand.Intn(10))*time.Millisecond)count = x; fmt.Println(s, i, "Count: ", count)mutex.Unlock()}wait.Done()}func main(){wait.Add(2)go increment("foo: ")go increment("bar: ")wait.Wait()fmt.Println("last count value " , count)}

输出:
bar:0 Count:1bar:1 Count:2bar:2 Count:3bar:3 Count:4bar:4 Count:5bar:5 Count:6bar:6 Count:7bar:7 Count:8bar:8 Count:9bar:9 Count:10foo:0 Count:11foo:1 Count:12foo:2 Count:13foo:3 Count:14foo:4 Count:15foo:5 Count:16foo:6 Count:17foo:7 Count:18foo:8 Count:19foo:9 Count:20last count value20

    推荐阅读