成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Golang中的互斥鎖Mutex與讀寫鎖RWMutex詳解

開發 前端
本文講解了互斥鎖和讀寫鎖的特點,兩種鎖都可以用于協調多個并發訪問共享資源的同步機制。可以看出互斥鎖適用于讀寫不確定,并且只有一個讀或者寫的場景;讀寫鎖適用于讀多寫少的場景,可以有更高的性能。

Golang中的sync包實現了兩種鎖:互斥鎖(Mutex)和讀寫鎖(RWMutex)。

互斥鎖(sync.Mutex)

  • 使用Lock方法加鎖,使用Unlock方法解鎖,Golang從1.18新增了TryLock方法,用于嘗試獲取鎖,返回成功或者失敗;
  • 如果Mutex被一個goroutine獲取后,其他goroutine只能等到這個goroutine釋放該Mutex后才能獲取;
  • 使用Lock方法加鎖后,不能再次加鎖,直到使用Unlock方法釋放鎖后才能再次加鎖;加鎖之前使用Unlock方法會導致panic;
  • Mutex并不與特定的goroutine相關聯,一個goroutine加鎖,也可以使用另一個goroutine解鎖;
  • 在同一個goroutine中的Mutex解鎖之前再次進行加鎖,會導致死鎖。

互斥鎖的一個經典案例是對切片進行并發安全的操作,代碼如下:

package main

import (
	"fmt"
	"sync"
)

var mu sync.Mutex
var slice []int

func main() {
	var wg sync.WaitGroup
	for i := 0; i < 10; i++ {
		wg.Add(1)
		go func() {
			for j := 0; j < 100; j++ {
				mu.Lock()
				slice = append(slice, j)
				mu.Unlock()
			}
			wg.Done()
		}()
	}
	wg.Wait()
	fmt.Println(len(slice))
}

首先定義了一個長度為0的slice,并發地對其進行了1000次append操作。

讀寫鎖(RWMutex)

  • RWMutex該鎖可以加多個讀鎖(RLock)或者一個寫鎖(Lock),Golang從1.18新增了TryLock和TryRLock方法,分別用于嘗試獲取寫鎖和讀鎖,返回成功或者失敗。
  • 讀鎖被占用的情況下會阻止寫,不會阻止讀,多個goroutine可以同時獲得讀鎖。
  • 寫鎖會阻止其他goroutine對寫鎖和讀鎖的獲取。

看一個代碼示例:

package main

import (
	"log"
	"sync"
)

var mu sync.RWMutex
var m map[string]string

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

	mu.Lock()
	m["a"] = "A"
	mu.Unlock()

	var wg sync.WaitGroup
	for i := 0; i < 10; i++ {
		wg.Add(1)
		go func(i int) {
			mu.RLock()
			log.Println(m["a"]) // 并發讀
			mu.RUnlock()
			wg.Done()
		}(i)
	}
	wg.Wait()
}

首先定義了一個map,然后對其進行了一次寫操作和10次并發讀操作。在并發讀的時候,使用讀鎖來支持并發訪問。

小結

本文講解了互斥鎖和讀寫鎖的特點,兩種鎖都可以用于協調多個并發訪問共享資源的同步機制。可以看出互斥鎖適用于讀寫不確定,并且只有一個讀或者寫的場景;讀寫鎖適用于讀多寫少的場景,可以有更高的性能。需要注意的是盡量避免在鎖的范圍內進行耗時較長的操作,以免影響性能。

責任編輯:姜華 來源: 今日頭條
相關推薦

2023-03-10 15:45:03

Golang公平鎖

2023-12-24 12:33:20

互斥鎖Go代碼

2024-06-28 08:45:58

2020-08-26 08:59:58

Linux線程互斥鎖

2020-09-16 07:56:28

多線程讀寫鎖悲觀鎖

2024-10-14 08:51:52

協程Go語言

2024-01-29 01:08:01

悲觀鎖遞歸鎖讀寫鎖

2021-05-25 09:28:34

鴻蒙HarmonyOS應用

2024-06-24 08:10:00

C++互斥鎖

2009-10-12 09:02:03

SmartRWLock

2019-11-28 16:00:06

重入鎖讀寫鎖樂觀鎖

2021-03-22 11:27:06

C語言Peterson(皮特互斥鎖

2024-05-15 09:41:22

樂觀鎖編程

2024-07-25 09:01:22

2011-08-18 13:44:42

Oracle悲觀鎖樂觀鎖

2019-01-04 11:18:35

獨享鎖共享鎖非公平鎖

2024-10-10 09:40:29

2024-11-28 09:47:53

C#互斥鎖Mutex

2021-03-24 08:02:58

C語言

2024-06-11 00:01:00

并發validate場景
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 久久久久久久久久久成人 | 中文字幕久久精品 | www.五月天婷婷.com | 久久久久久久一区二区 | 国产av毛片 | 久久高清免费视频 | 国产精品福利网站 | 一区二区三区视频在线免费观看 | 日韩a在线 | 日本 欧美 国产 | 日韩高清不卡 | 久久精品网 | 一区二区三区视频在线观看 | 亚洲精品日韩视频 | 国产一区二区麻豆 | 婷婷色国产偷v国产偷v小说 | 国产精品久久久久久久久久99 | 日韩国产一区二区三区 | 精品免费av| 国产午夜精品一区二区三区嫩草 | 久久久91精品国产一区二区三区 | 中文字幕一区二区不卡 | 亚洲欧美成人影院 | 精品久久久久久久久久 | 精品欧美一区二区精品久久久 | 欧美国产日韩在线观看 | 国产第1页 | 亚洲第一区国产精品 | 成人小视频在线观看 | 高清国产午夜精品久久久久久 | 在线观看国产www | 伊人网站在线观看 | 丁香综合| 欧美一区二区三区在线播放 | 久久青 | 欧美一级免费 | 一区二区三区视频在线观看 | 日韩中文字幕一区二区 | 国产亚洲第一页 | 国产自产21区 | 人人九九精 |