最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Go語(yǔ)言中樂(lè)觀鎖與悲觀鎖的具體使用

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

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

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

問(wèn)題

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

悲觀鎖

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

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

樂(lè)觀鎖

樂(lè)觀的鎖總認(rèn)為不會(huì)發(fā)生并發(fā)問(wèn)題,屬于樂(lè)天派。

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

Go語(yǔ)言中的樂(lè)觀鎖與悲觀鎖

sync/atomic

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

sync

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

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ā)安全,性能高于互斥鎖,只針對(duì)go中的一些基本數(shù)據(jù)類型使用
func AmAdd() {
	atomic.AddInt64(&x, 1)
	wg.Done()
}

func main() {
	// 原子操作atomic包
	// 加鎖操作涉及到內(nèi)核態(tài)的上下文切換, 比較耗時(shí),代價(jià)高
	// 針對(duì)基本數(shù)據(jù)類型我們還可以使用原子操作來(lái)保證并發(fā)安全
	// 因?yàn)樵硬僮魇莋o語(yǔ)言提供的方法,我們?cè)谟脩魬B(tài)就可以完成,因此性能比加鎖操作更好
	// go語(yǔ)言的原子操作由內(nèi)置的庫(kù),sync/atomic完成

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

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

}

參考博客1

參考博客2

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

您可能感興趣的文章:

相關(guān)文章

  • golang接收post和get請(qǐng)求參數(shù)處理

    golang接收post和get請(qǐng)求參數(shù)處理

    本文主要介紹了golang接收post和get請(qǐng)求參數(shù)處理,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-03-03
  • go語(yǔ)言編程之select信道處理示例詳解

    go語(yǔ)言編程之select信道處理示例詳解

    這篇文章主要為大家介紹了go語(yǔ)言編程之select信道處理示例詳解,<BR>有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步早日升職加薪
    2022-04-04
  • Go語(yǔ)言實(shí)現(xiàn)將中文轉(zhuǎn)化為拼音功能

    Go語(yǔ)言實(shí)現(xiàn)將中文轉(zhuǎn)化為拼音功能

    這篇文章主要為大家詳細(xì)介紹了Go語(yǔ)言中如何實(shí)現(xiàn)將中文轉(zhuǎn)化為拼音功能,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2025-01-01
  • 深入刨析Golang-map底層原理

    深入刨析Golang-map底層原理

    這篇文章主要介紹了深入刨析Golang-map底層原理,Go 語(yǔ)言的 map 的使用非常簡(jiǎn)易, 但其內(nèi)部實(shí)現(xiàn)相對(duì)比較復(fù)雜,文中有相關(guān)的代碼示例,,需要的朋友可以參考下
    2023-05-05
  • golang查看CPU使用率與內(nèi)存的方法詳解

    golang查看CPU使用率與內(nèi)存的方法詳解

    這篇文章主要給大家介紹了golang查看CPU使用率與內(nèi)存的方法,以及拓展介紹源碼里//go:指令,文中有詳細(xì)的代碼示例以及圖文介紹,需要的朋友可以參考下
    2023-10-10
  • golang中context.WithValue的使用規(guī)范問(wèn)題小結(jié)

    golang中context.WithValue的使用規(guī)范問(wèn)題小結(jié)

    本文主要介紹了golang中context.WithValue的使用規(guī)范問(wèn)題,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2025-02-02
  • Golang httptest包測(cè)試使用教程

    Golang httptest包測(cè)試使用教程

    這篇文章主要介紹了Golang httptest包測(cè)試使用,httptest包的理念是,非常容易模擬http服務(wù),也就是說(shuō)模擬響應(yīng)寫(xiě)(response writer),提供給http處理器(handle),讓我們測(cè)試http服務(wù)端和客戶端很容易
    2023-03-03
  • 快速升級(jí)Go版本(幾分鐘就搞定了)

    快速升級(jí)Go版本(幾分鐘就搞定了)

    go現(xiàn)在的更新速度是非常的快啊,用著用著網(wǎng)上的教程就不配套了,下面這篇文章主要給大家介紹了關(guān)于快速升級(jí)Go版本的相關(guān)資料,文中介紹的方法幾分鐘就搞定了,需要的朋友可以參考下
    2024-05-05
  • Golang?依賴注入經(jīng)典解決方案uber/fx理論解析

    Golang?依賴注入經(jīng)典解決方案uber/fx理論解析

    這篇文章主要為大家介紹了Golang依賴注入經(jīng)典解決方案uber/fx理論解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-05-05
  • golang原生http包實(shí)現(xiàn)各種情況的get請(qǐng)求方式

    golang原生http包實(shí)現(xiàn)各種情況的get請(qǐng)求方式

    這篇文章主要介紹了golang原生http包實(shí)現(xiàn)各種情況的get請(qǐng)求方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-08-08

最新評(píng)論

庆阳市| 海城市| 新巴尔虎左旗| 黑水县| 丰原市| 金乡县| 原平市| 浮梁县| 岐山县| 酒泉市| 丘北县| 衡东县| 墨竹工卡县| 绥滨县| 宜兰市| 喜德县| 方正县| 嵊州市| 寿光市| 昆山市| 渭南市| 象山县| 旬阳县| 石嘴山市| 三明市| 盐津县| 同江市| 福泉市| 彭泽县| 桂东县| 仪征市| 山西省| 泉州市| 曲靖市| 即墨市| 积石山| 理塘县| 赫章县| 鹤庆县| 萨嘎县| 贵港市|