欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Go語言中樂觀鎖與悲觀鎖的具體使用

 更新時間:2024年01月09日 09:45:28   作者:別人家的孩子zyh  
樂觀鎖和悲觀鎖是兩種思想,用于解決并發(fā)場景下的數(shù)據競爭問題,本文主要介紹了Go語言中樂觀鎖與悲觀鎖的具體使用,具有一定的參考價值,感興趣的可以了解一下

改變一個數(shù)值的三個步驟

  • 把想修改的數(shù)值從某個地方取出來
  • 將取出來的數(shù)值修改為期望值
  • 把修改后的數(shù)值保存到原來的地方

問題

如果在做第2步時,有另一個過程(進程或線程)對同一個數(shù)值進行同樣的操作(取值、修改),那么當這兩個過程都要做第3步的時候,就肯定有一個過程是白干活的。

悲觀鎖

悲觀的鎖總認為會發(fā)生并發(fā)問題,屬于保守派。
如果想修改一個數(shù)值,立馬給這個數(shù)值上一把鎖,標明這個數(shù)值正在被修改,誰也不能修改了;然后才開始三步走,在三步走的過程結束以后,再把鎖解除。

當有其他過程想要修改同一個數(shù)值時,看到了鎖就不進行三步走了,而是選擇等待;當鎖被解除了,自己在數(shù)值也加一把鎖,然后開始三步走,在三個步驟走完了,也把鎖解除。

樂觀鎖

樂觀的鎖總認為不會發(fā)生并發(fā)問題,屬于樂天派。

修改數(shù)據時不加鎖,正常進行1、2步,在進行第3步的時候,確認一下數(shù)值是否進行了修改,如果被修改過,放棄修改,重新走一遍1、2、3步(或者放棄對數(shù)值進行修改)。

Go語言中的樂觀鎖與悲觀鎖

sync/atomic

Go語言有一個atomic包,可以在不形成臨界區(qū)和創(chuàng)建互斥量的情況下完成并發(fā)安全的值替換操作,這個包應用的便是樂觀鎖的原理
但是這個包只支持int32/int64/uint32/uint64/uintptr這幾種數(shù)據類型的一些基礎操作,如增減、交換、載入、存儲等

sync

Go語言中的sync包提供了各種鎖,如果使用了這個包,基本就以悲觀鎖的工作模式了

go代碼示例

package main

import (
	"fmt"
	"sync"
	"sync/atomic"
	"time"
)

var (
	x  int64
	mu sync.Mutex
	wg sync.WaitGroup
)

// 普通函數(shù), 并發(fā)不安全
func Add() {
	x++
	wg.Done()
}

// 互斥鎖, 并發(fā)安全,性能低于原子操作
func muAdd() {
	mu.Lock()
	x++
	mu.Unlock()
	wg.Done()
}

// 原子操作,并發(fā)安全,性能高于互斥鎖,只針對go中的一些基本數(shù)據類型使用
func AmAdd() {
	atomic.AddInt64(&x, 1)
	wg.Done()
}

func main() {
	// 原子操作atomic包
	// 加鎖操作涉及到內核態(tài)的上下文切換, 比較耗時,代價高
	// 針對基本數(shù)據類型我們還可以使用原子操作來保證并發(fā)安全
	// 因為原子操作是go語言提供的方法,我們在用戶態(tài)就可以完成,因此性能比加鎖操作更好
	// go語言的原子操作由內置的庫,sync/atomic完成

	start := time.Now()
	for i := 0; i < 10000; i++ {
		wg.Add(1)
		go Add() // 普通版Add函數(shù)不是并發(fā)安全的
		// go muAdd() // 加鎖版Add函數(shù),是并發(fā)安全的, 但是加鎖性能開銷大
		// go AmAdd() // 原子操作版Add函數(shù),是并發(fā)安全的,性能優(yōu)于加鎖版
	}

	end := time.Now()
	wg.Wait()
	fmt.Println(x)
	fmt.Println(end.Sub(start))

}

參考博客1

參考博客2

到此這篇關于Go語言中樂觀鎖與悲觀鎖的具體使用的文章就介紹到這了,更多相關Go語言 樂觀鎖與悲觀鎖內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • go語言開發(fā)中如何優(yōu)雅得關閉協(xié)程方法

    go語言開發(fā)中如何優(yōu)雅得關閉協(xié)程方法

    這篇文章主要為大家介紹了go語言開發(fā)中如何優(yōu)雅得關閉協(xié)程方法詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-05-05
  • go語言的sql包原理與用法分析

    go語言的sql包原理與用法分析

    這篇文章主要介紹了go語言的sql包原理與用法,較為詳細的分析了Go語言里sql包的結構、相關函數(shù)與使用方法,需要的朋友可以參考下
    2016-07-07
  • 代碼之美:探索Go語言斷行規(guī)則的奧秘

    代碼之美:探索Go語言斷行規(guī)則的奧秘

    Go語言是一門以簡潔、清晰和高效著稱的編程語言,而斷行規(guī)則是其代碼風格的重要組成部分,通過深入研究Go語言的斷行規(guī)則,我們可以更好地理解和編寫優(yōu)雅的代碼,本文將從語法規(guī)范、代碼風格和最佳實踐等方面進行探討,幫助讀者更好地理解和應用Go語言的斷行規(guī)則
    2023-10-10
  • Go語言算法之尋找數(shù)組第二大元素的方法

    Go語言算法之尋找數(shù)組第二大元素的方法

    這篇文章主要介紹了Go語言算法之尋找數(shù)組第二大元素的方法,以實例形式分析了不排序、只循環(huán)一次來實現(xiàn)尋找數(shù)組第二大元素的技巧,是比較典型的算法,需要的朋友可以參考下
    2015-02-02
  • Golang 并發(fā)控制模型的實現(xiàn)

    Golang 并發(fā)控制模型的實現(xiàn)

    Go控制并發(fā)有三種經典的方式,使用?channel?通知實現(xiàn)并發(fā)控制、使用 sync 包中的?WaitGroup?實現(xiàn)并發(fā)控制、使用?Context?上下文實現(xiàn)并發(fā)控制,下面就來介紹一下
    2024-08-08
  • Go語言Cookie用法分析

    Go語言Cookie用法分析

    這篇文章主要介紹了Go語言Cookie用法,結合實例形式分析了Go語言Cookie的設置、讀取等相關操作技巧,需要的朋友可以參考下
    2017-02-02
  • Golang實現(xiàn)帶優(yōu)先級的select

    Golang實現(xiàn)帶優(yōu)先級的select

    這篇文章主要為大家詳細介紹了如何在Golang中實現(xiàn)帶優(yōu)先級的select,文中的示例代碼講解詳細,對我們學習Golang有一定的幫助,需要的可以參考一下
    2023-04-04
  • Go語言導出內容到Excel的方法

    Go語言導出內容到Excel的方法

    這篇文章主要介紹了Go語言導出內容到Excel的方法,涉及Go語言操作excel的技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-02-02
  • 詳解Golang如何實現(xiàn)一個環(huán)形緩沖器

    詳解Golang如何實現(xiàn)一個環(huán)形緩沖器

    環(huán)形緩沖器(ringr?buffer)是一種用于表示一個固定尺寸、頭尾相連的緩沖區(qū)的數(shù)據結構,適合緩存數(shù)據流。本文將利用Golang實現(xiàn)一個環(huán)形緩沖器,需要的可以參考一下
    2022-09-09
  • go語言實現(xiàn)十大常見的排序算法示例

    go語言實現(xiàn)十大常見的排序算法示例

    這篇文章主要為大家介紹了go語言實現(xiàn)十大常見的排序算法示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-08-08

最新評論