溫馨提示×

Go語言中的互斥鎖和讀寫鎖怎么使用

小億
86
2024-04-12 20:05:12
欄目: 編程語言

在Go語言中,可以使用sync包中的Mutex類型來實現(xiàn)互斥鎖,使用sync包中的RWMutex類型來實現(xiàn)讀寫鎖。下面是它們的基本用法示例:

  1. 互斥鎖(Mutex):
package main

import (
	"fmt"
	"sync"
)

var mutex sync.Mutex
var count int

func increment() {
	mutex.Lock()
	defer mutex.Unlock()
	count++
}

func main() {
	for i := 0; i < 10; i++ {
		go increment()
	}

	// 等待所有g(shù)oroutine執(zhí)行完畢
	mutex.Lock()
	defer mutex.Unlock()
	fmt.Println(count)
}
  1. 讀寫鎖(RWMutex):
package main

import (
	"fmt"
	"sync"
)

var rwMutex sync.RWMutex
var data map[string]string

func readData(key string) {
	rwMutex.RLock()
	defer rwMutex.RUnlock()
	fmt.Println(data[key])
}

func writeData(key, value string) {
	rwMutex.Lock()
	defer rwMutex.Unlock()
	data[key] = value
}

func main() {
	data = make(map[string]string)

	writeData("key1", "value1")

	for i := 0; i < 10; i++ {
		go readData("key1")
	}

	// 等待所有g(shù)oroutine執(zhí)行完畢
	rwMutex.Lock()
	defer rwMutex.Unlock()
	for k, v := range data {
		fmt.Println(k, v)
	}
}

在使用互斥鎖和讀寫鎖時,需要注意以下幾點:

  • 互斥鎖適用于讀寫互斥的情況,讀寫鎖適用于讀多寫少的情況。
  • 對于互斥鎖,使用Lock()方法獲取鎖,使用Unlock()方法釋放鎖。
  • 對于讀寫鎖,使用RLock()方法獲取讀鎖,使用RUnlock()方法釋放讀鎖;使用Lock()方法獲取寫鎖,使用Unlock()方法釋放寫鎖。

0