Go併發程式設計之美-互斥鎖
一、前言
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中互斥鎖是獨佔鎖,並且是不可重入鎖,同一個執行緒並不可獲取同一個鎖多次。
相關文章
- Go併發程式設計之傳統同步—(1)互斥鎖Go程式設計
- Go 語言併發程式設計之互斥鎖詳解 sync.MutexGo程式設計Mutex
- Go併發程式設計之美-CAS操作Go程式設計
- Java 多執行緒併發程式設計之互斥鎖 Reentrant LockJava執行緒程式設計
- python 之 併發程式設計(守護程式、互斥鎖、IPC通訊機制)Python程式設計
- Go 併發程式設計之 MutexGo程式設計Mutex
- 【漫畫】JAVA併發程式設計 J.U.C Lock包之ReentrantLock互斥鎖Java程式設計ReentrantLock
- 併發程式設計之 Java 三把鎖程式設計Java
- 併發程式設計之顯式鎖原理程式設計
- java程式設計思想之併發(死鎖)Java程式設計
- Go 併發程式設計Go程式設計
- Java併發程式設計之鎖機制之AQSJava程式設計AQS
- Java併發程式設計之鎖機制之(ReentrantLock)重入鎖Java程式設計ReentrantLock
- 併發程式設計之——寫鎖原始碼分析程式設計原始碼
- Go 併發程式設計 - 併發安全(二)Go程式設計
- Java併發程式設計之鎖機制之Lock介面Java程式設計
- Java併發程式設計之鎖機制之LockSupport工具Java程式設計
- Java併發程式設計-鎖及併發容器Java程式設計
- 併發程式設計之 鎖的優化有哪些程式設計優化
- 併發程式設計之死鎖解析程式設計
- Go併發程式設計之原子操作sync/atomicGo程式設計
- Java併發程式設計之鎖機制之Condition介面Java程式設計
- Java併發程式設計之鎖機制之引導篇Java程式設計
- Go語言併發程式設計Go程式設計
- go併發程式設計筆記Go程式設計筆記
- 八. Go併發程式設計--errGroupGo程式設計
- Go併發程式設計--Mutex/RWMutexGo程式設計Mutex
- Go併發程式設計基礎Go程式設計
- Java併發程式設計,互斥同步和執行緒之間的協作Java程式設計執行緒
- Java併發程式設計之美-千無萬喚使出來Java程式設計
- Java併發程式設計之鎖機制之ReentrantReadWriteLock(讀寫鎖)Java程式設計
- 併發程式設計實戰——鎖分段程式設計
- 悲觀的併發策略——synchronized互斥鎖synchronized
- GO安全併發之無鎖原子操作Go
- 十二. Go併發程式設計--sync/errGroupGo程式設計
- 十.Go併發程式設計--channel使用Go程式設計
- 【Go進階—併發程式設計】MutexGo程式設計Mutex
- 六. Go併發程式設計--WaitGroupGo程式設計AI