溫馨提示×

Go語言并發安全有哪些例子

小樊
106
2024-10-25 21:49:07
欄目: 編程語言

Go語言的并發安全體現在多個方面,以下是一些并發安全的例子:

  1. sync.Mutex互斥鎖:這是Go語言提供的用于保護共享資源的同步原語。當一個goroutine持有一個互斥鎖時,其他goroutine不能獲取該鎖,從而保證了同一時間只有一個goroutine能夠訪問被保護的資源。例如:
var mu sync.Mutex
var counter int

func increment() {
    mu.Lock()
    defer mu.Unlock()
    counter++
}
  1. sync.RWMutex讀寫鎖:這是一種特殊的互斥鎖,允許多個goroutine同時讀取共享資源,但在寫入時會阻塞其他goroutine的讀取和寫入操作。這在讀操作遠多于寫操作的場景下非常有用。例如:
var rwMu sync.RWMutex
var sharedData map[string]string

func readData(key string) string {
    rwMu.RLock()
    defer rwMu.RUnlock()
    return sharedData[key]
}

func writeData(key, value string) {
    rwMu.Lock()
    defer rwMu.Unlock()
    sharedData[key] = value
}
  1. sync.WaitGroup等待組:用于等待一組goroutine完成執行。通過調用Add()方法增加等待的goroutine數量,每個goroutine在執行完畢前會調用Done()方法減少計數,而主goroutine可以通過Wait()方法阻塞等待所有goroutine完成。例如:
var wg sync.WaitGroup

func worker(id int) {
    defer wg.Done()
    // 執行任務
}

func main() {
    for i := 0; i < 5; i++ {
        wg.Add(1)
        go worker(i)
    }
    wg.Wait()
}
  1. channel通道:Go語言的channel是一種內置的數據結構,用于在不同的goroutine之間安全地傳遞數據。channel內部處理了必要的鎖定和同步,因此可以安全地在多個goroutine之間傳遞消息或數據。例如:
ch := make(chan int)

go func() {
    ch <- 42
}()

value := <-ch
fmt.Println(value) // 輸出:42

這些例子展示了Go語言中并發安全的常見實現方式。當然,Go語言還提供了許多其他并發原語和工具,如sync.Once、sync.Map等,可以根據具體需求選擇使用。

0
亚洲午夜精品一区二区_中文无码日韩欧免_久久香蕉精品视频_欧美主播一区二区三区美女