使用go来访问共享变量避免冲突的时候可以用 sync.Mutex这个类型,其中的Lock和Unlok方法可以保证在使用该变量的时候只能有一个进程可以访问该变量,从而避免冲突。 (其实就是实现互斥

    1. package main
    2. import (
    3. "fmt"
    4. "sync"
    5. "time"
    6. )
    7. type SafeCounter struct {
    8. v map[string]int
    9. // 互斥锁类型,拥有两个方法
    10. mux sync.Mutex
    11. }
    12. // Inc增加给定key的计数器的值
    13. func (c *SafeCounter) Inc(key string) {
    14. c.mux.Lock()
    15. //Lock之后同一时刻只能有一个goroutine能访问c.v
    16. c.v[key]++
    17. c.mux.Unlock()
    18. }
    19. // Value返回给定key的计数器的当前值
    20. func (c *SafeCounter) Value(key string) int {
    21. c.mux.Lock()
    22. // 用defer来保证互斥锁一定会被解锁
    23. defer c.mux.Unlock()
    24. return c.v[key]
    25. }
    26. func main() {
    27. c := SafeCounter{v: make(map[string]int)}
    28. for i := 0; i < 10000000; i++ {
    29. go c.Inc("somekey")
    30. }
    31. //感觉这一句没啥用啊,为啥要写在这,让go程睡一会儿吗
    32. // 但是上面的go程已经执行完了啊
    33. // time.Sleep(5 * time.Millisecond)
    34. //注释掉以后发现这句时必须的,不然的话没法每次输出的值都不一样
    35. // 据说time.Tick可代替time.Sleep
    36. time.Tick(50 * time.Millisecond)
    37. // 输出有多少个"somekey"
    38. fmt.Println(c.Value("somekey"))
    39. fmt.Println(c.v) //ouput: map[somekey:10000000]
    40. }