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

goland?-sync/atomic原子操作小結(jié)

 更新時(shí)間:2022年08月09日 11:08:19   作者:Jeff的技術(shù)棧  
這篇文章主要介紹了goland?-sync/atomic原子操作,原子操作能夠保證執(zhí)行期間是連續(xù)且不會(huì)被中斷(變量不會(huì)被其他修改,mutex可能存在被其他修改的情況),本文給大家介紹的非常詳細(xì),需要的朋友參考下

1.go已經(jīng)提供了鎖,為什么還需要atomic原子操作?

1.加鎖代價(jià)比較高,耗時(shí)多,需要上下文切換。加鎖解鎖在代碼層實(shí)現(xiàn),而代碼是運(yùn)行在用戶態(tài)空間中,對(duì)底層進(jìn)行操作時(shí)需要從用戶態(tài)空間切換到內(nèi)核空間,再由內(nèi)核操作底層資源。耗時(shí)多

2.原子操作在用戶態(tài)可以完成,性能比互斥鎖高。原子操作在cpu層面支持的,cpu可以直接操作底層資源

3.原子操作需求步驟簡單,無需加鎖解鎖步驟

2.atomic原子操作為什么比mutex快?

1.原子操作快,是因?yàn)橐蕾囉赾pu指令,而不是依賴外部鎖。不會(huì)額外的上下文切換
2.原子操作能夠保證執(zhí)行期間是連續(xù)且不會(huì)被中斷(變量不會(huì)被其他修改,mutex可能存在被其他修改的情況)

3.CAS

CAS是cpu硬件同步原語,是Compare And Swap的縮寫(比較并交換),原子操作中CAS,再sync/atomic包中,全部以ComparAndSwap開頭的函數(shù)名都是CAS操作
   go中CAS操作,是借用CPU提供的原子性指令來實(shí)現(xiàn)。CAS操作修改共享變量時(shí),不需要對(duì)共享變量加鎖,而是通過類似樂觀鎖的方式進(jìn)行檢查,本質(zhì)還是不斷的占用CPU資源換取加鎖帶來的開銷(如上下文切換時(shí)間開銷)。

原子操作優(yōu)勢(shì):
   可以在不形成臨界區(qū)和創(chuàng)建互斥量的情況下完成并發(fā)安全的值替換操作。這可以大大的減少同步對(duì)程序性能的損耗。

原子操作劣勢(shì):
   在被操作值被頻繁的變更的情況下,CAS操作并不那么容易成功。因?yàn)樾枰獙?duì)ild值進(jìn)行匹配,只有匹配成功了才進(jìn)行下一步的修改。

當(dāng)前atmomic包有以下幾種原子操作:
   Add,ComparAndSwap,Load,Store,Swap

4.互斥鎖與原子操作區(qū)別

互斥鎖目的:互斥鎖是用來保護(hù)一段邏輯的,保證并發(fā)安全。(比如操作數(shù)據(jù)庫保護(hù))
原子操作目的:原子操作作用于一個(gè)變量的更新保護(hù),保證并發(fā)安全(比如操作數(shù)據(jù)庫不能原子操作)

mutex底層實(shí)現(xiàn):mutex由操作系統(tǒng)的調(diào)度器實(shí)現(xiàn)
原子操作底層實(shí)現(xiàn):由底層硬件指令直接提供支持,這些指令在執(zhí)行過程中不允許中斷,因此原子操作可以在無鎖的情況下保證并發(fā)安全,性能隨cpu的數(shù)量增多而線性擴(kuò)展。

5.原子操作方法

5.1 atomic.AddInt32--增減

增減,操作方法的命名方式為AddXXX,保證對(duì)操作數(shù)進(jìn)行原子的增減,支持的類型為int32、int64、uint32、uint64、uintptr,使用時(shí)以AddXXX就是對(duì)應(yīng)的操作方法。

//加
func demo() {
	var count int32 = 0
	atomic.AddInt32(&count, 10)
	fmt.Println(count) //10
}
//減
func demo() {
	var count int32 = 0
	atomic.AddInt32(&count, -10)
	fmt.Println(count) //-10
}

鎖和原子操作對(duì)比:

//Mutex鎖
func demo1() {
	sta := time.Now().Unix()
	count := 0
	mux := sync.Mutex{}
	wg := sync.WaitGroup{}
	for i := 0; i < 10000; i++ {
		wg.Add(1)
		go func() {
			defer wg.Done()
			for j := 0; j < 10000; j++ {
				mux.Lock()
				count++
				mux.Unlock()
			}
		}()
	}
	wg.Wait()
	fmt.Println(count) //100000000
	fmt.Println(time.Now().Unix() - sta) //10秒
}

//atomic原子操作:快2倍不止
func demo2() {
	sta := time.Now().Unix()
	wg := sync.WaitGroup{}
	var count int32 = 0
	for i := 0; i < 10000; i++ {
		wg.Add(1)
		go func() {
			defer wg.Done()
			for j := 0; j < 10000; j++ {
				atomic.AddInt32(&count, 1)
			}
		}()
	}
	wg.Wait()
	fmt.Println(count) //100000000
	fmt.Println(time.Now().Unix() - sta) //4秒
}

5.2 CAS-atomic.CompareAndSwapInt32--比較并替換

CompareAndSwap:比較并替換,類似樂觀鎖,先比較下old值與當(dāng)前值是否一致,一致則把new的值替換
操作方法的命名方式為CompareAndSwapXXX

//true
func demo3() {
	var count int32 = 0
	boo := atomic.CompareAndSwapInt32(&count, 0, 100)
	fmt.Println(count) //100
	fmt.Println(boo)   //true
}


//false
func demo3() {
	var count int32 = 0
	boo := atomic.CompareAndSwapInt32(&count, 10, 100)
	fmt.Println(count) //0
	fmt.Println(boo) //false
}

5.3 atomic.StoreInt32--寫操作

func demo3() {
	var count int32 = 0
	atomic.StoreInt32(&count, 666)
	fmt.Println(count) //666
}

5.4 atomic.LoadInt32--讀操作

func demo3() {
	var count int32 = 0
	atomic.StoreInt32(&count, 666)

	val := atomic.LoadInt32(&count)
	fmt.Println(val) //666
}

5.5 atomic.SwapInt32--直接交換

atomic.SwapInt32:直接交換,并返回交換前的值

func demo3() {
	var count int32 = 0
	old := atomic.SwapInt32(&count, 100)
	fmt.Println(old)   //0
	fmt.Println(count) //100
}

到此這篇關(guān)于goland-sync/atomic原子操作的文章就介紹到這了,更多相關(guān)goland sync/atomic原子操作內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Golang實(shí)現(xiàn)文件傳輸功能

    Golang實(shí)現(xiàn)文件傳輸功能

    這篇文章主要為大家詳細(xì)介紹了Golang實(shí)現(xiàn)文件傳輸功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-07-07
  • GoFrame基于性能測(cè)試得知grpool使用場(chǎng)景

    GoFrame基于性能測(cè)試得知grpool使用場(chǎng)景

    這篇文章主要為大家介紹了GoFrame基于性能測(cè)試得知grpool使用場(chǎng)景示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-06-06
  • Go語言中實(shí)現(xiàn)完美錯(cuò)誤處理實(shí)踐分享

    Go語言中實(shí)現(xiàn)完美錯(cuò)誤處理實(shí)踐分享

    Go?語言是一門非常流行的編程語言,由于其高效的并發(fā)編程和出色的網(wǎng)絡(luò)編程能力,越來越受到廣大開發(fā)者的青睞。本文我們就來深入探討一下Go?語言中的錯(cuò)誤處理機(jī)制吧
    2023-04-04
  • win10下安裝Go和Goland的詳細(xì)教程

    win10下安裝Go和Goland的詳細(xì)教程

    這篇文章主要介紹了win10下安裝Go和Goland的詳細(xì)教程,本文給大家提到了go和golang之間的區(qū)別,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-12-12
  • Go中Vendo機(jī)制的使用

    Go中Vendo機(jī)制的使用

    自Go1.6起,Go語言正式啟用vendor機(jī)制,允許將項(xiàng)目依賴放入項(xiàng)目內(nèi)的vendor目錄,類似私有GOPATH,本文就來介紹一下Vendo機(jī)制的使用,感興趣的可以了解一下
    2024-10-10
  • Golang日志庫logrus的介紹與使用示例代碼

    Golang日志庫logrus的介紹與使用示例代碼

    Logrus是Go語言的一個(gè)功能豐富的日志庫,支持結(jié)構(gòu)化日志和多級(jí)別日志記錄,它兼容標(biāo)準(zhǔn)log庫,并可通過自定義Hooks和Formatter進(jìn)行高度定制化,支持集成如syslog等系統(tǒng),便于管理和分析,Logrus還支持自定義日志顏色和格式,以及根據(jù)日志級(jí)別進(jìn)行不同處理,如panic和exit
    2024-10-10
  • Go-客戶信息關(guān)系系統(tǒng)的實(shí)現(xiàn)

    Go-客戶信息關(guān)系系統(tǒng)的實(shí)現(xiàn)

    這篇文章主要介紹了Go-客戶信息關(guān)系系統(tǒng)的實(shí)現(xiàn),本文章內(nèi)容詳細(xì),具有很好的參考價(jià)值,希望對(duì)大家有所幫助,需要的朋友可以參考下
    2023-01-01
  • go 熔斷原理分析與源碼解讀

    go 熔斷原理分析與源碼解讀

    這篇文章主要為大家介紹了go 熔斷原理分析與源碼解讀,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-08-08
  • Go語言omitempty選項(xiàng)的實(shí)現(xiàn)

    Go語言omitempty選項(xiàng)的實(shí)現(xiàn)

    本文主要介紹了Go語言omitempty選項(xiàng)的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-06-06
  • Go語言中的訪問權(quán)限控制

    Go語言中的訪問權(quán)限控制

    在?go?中進(jìn)行權(quán)限管理時(shí),推薦使用?grouper、casbin?和?sentry?框架,grouper?適合基于角色的訪問控制,casbin?提供高級(jí)?rbac?功能,而?sentry?提供云托管權(quán)限服務(wù)和豐富的功能集,包括多因素認(rèn)證和活動(dòng)審核,這些框架有助于在電子商務(wù)網(wǎng)站等實(shí)際場(chǎng)景中實(shí)施細(xì)粒度的訪問控制
    2024-08-08

最新評(píng)論

香港 | 广州市| 遂川县| 安陆市| 石屏县| 永定县| 洛宁县| 岳西县| 苍梧县| 富源县| 福建省| 精河县| 临夏县| 天津市| 平利县| 宁波市| 安化县| 峨眉山市| 六枝特区| 北川| 芒康县| 金寨县| 六枝特区| 日照市| 扎兰屯市| 咸阳市| 蒙山县| 公主岭市| 台北市| 井研县| 临海市| 会理县| 丰城市| 泽州县| 惠来县| 苍南县| 凌云县| 武安市| 明溪县| 宜州市| 武安市|