溫馨提示×

Go語言互斥鎖如何發(fā)揮作用

小樊
81
2024-11-02 19:40:33
欄目: 編程語言

在Go語言中,互斥鎖(Mutex)是一種同步原語,用于確保多個goroutine在訪問共享資源時不會發(fā)生沖突?;コ怄i通過鎖定和解鎖操作來實現(xiàn)對共享資源的獨占訪問。當(dāng)一個goroutine獲得鎖時,其他嘗試獲得該鎖的goroutine將被阻塞,直到鎖被釋放。

Go語言的sync包提供了Mutex結(jié)構(gòu)體和相關(guān)的方法來實現(xiàn)互斥鎖。以下是一個簡單的示例,展示了如何使用互斥鎖來保護(hù)共享資源:

package main

import (
	"fmt"
	"sync"
	"time"
)

var (
	counter = 0
	mutex   sync.Mutex
)

func increment() {
	mutex.Lock() // 獲取鎖
	counter++
	mutex.Unlock() // 釋放鎖
}

func main() {
	var wg sync.WaitGroup

	for i := 0; i < 1000; i++ {
		wg.Add(1)
		go func() {
			defer wg.Done()
			increment()
		}()
	}

	wg.Wait() // 等待所有g(shù)oroutine完成
	fmt.Println("Counter:", counter)
}

在這個示例中,我們有一個全局變量counter和一個互斥鎖mutex。increment函數(shù)用于遞增counter,但在執(zhí)行遞增操作之前,我們首先通過調(diào)用mutex.Lock()獲取鎖。這樣可以確保在同一時間只有一個goroutine能夠訪問counter。在遞增操作完成后,我們通過調(diào)用mutex.Unlock()釋放鎖,以便其他goroutine可以獲取鎖并執(zhí)行遞增操作。

main函數(shù)中,我們創(chuàng)建了1000個goroutine來并發(fā)地調(diào)用increment函數(shù)。通過使用sync.WaitGroup,我們可以確保在所有g(shù)oroutine完成之前,主線程不會退出。最后,我們打印出遞增后的counter值。

總之,Go語言中的互斥鎖通過鎖定和解鎖操作來確保多個goroutine在訪問共享資源時不會發(fā)生沖突,從而實現(xiàn)線程安全的數(shù)據(jù)訪問。

0