• 从零开始学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/

    Go指南:https://tour.go-zh.org/list

  • 相关阅读:
    Add Binary <leetcode>
    那些坑
    面试集锦
    随看随记
    View的事件处理流程
    android studio view.setId报错
    EditText的hint不显示
    EditText 焦点
    Android拍照的那些事
    微信支付提示签名错误
  • 原文地址:https://www.cnblogs.com/VingB2by/p/11119886.html
Copyright © 2020-2023  润新知