Go併發程式設計之美-互斥鎖

weixin_34253539發表於2019-02-12

一、前言

go語言類似Java JUC包也提供了一些列用於多執行緒之間進行同步的措施,比如低階的同步措施有 鎖、CAS、原子變數操作類。相比Java來說go提供了獨特的基於通道的同步措施。本節我們先來看看go中互斥鎖

二、互斥鎖

互斥鎖是獨佔鎖,同時只有一個執行緒可以獲取該鎖,其他執行緒則會被阻塞掛起,等獲取鎖的執行緒釋放鎖後,阻塞的執行緒中的一個才可以被喚醒並獲取鎖。

本節我們使用獨佔鎖來實現一個執行緒安全的計數器:

package main

import (
    "fmt"
    "sync"
)

var (
    counter int//計數器
    wg      sync.WaitGroup//訊號量
    mutex   sync.Mutex//互斥鎖
)

func main() {
    //1.兩個訊號量
    wg.Add(2)

    //2.開啟兩個執行緒
    go incCounter()
    go incCounter()

    //3.等待子執行緒結束
    wg.Wait()
    fmt.Println(counter)
}

func incCounter() {
    defer wg.Done()

    //2.1.獲取鎖
    mutex.Lock()

    //2.2.計數加1
    counter++
    
    //2.3.釋放獨佔鎖
    mutex.Unlock()
}

  • 在go中使用 sync.Mutex 就可以獲取一個開箱即用的互斥鎖
  • counter是一個變數,這裡用來存放計數
  • wg用來實現主執行緒等待子執行緒執行完畢,程式碼(2)設定訊號為2,因為本例子裡面開啟了兩個字執行緒
  • 程式碼(2)開啟了兩個子執行緒,執行緒內首先獲取互斥鎖,然後累加計數,然後釋放鎖,最後遞減訊號量
  • 程式碼(3)等待子執行緒執行完畢後返回,然後列印計數

三、總結

go中互斥鎖是獨佔鎖,並且是不可重入鎖,同一個執行緒並不可獲取同一個鎖多次。

相關文章