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

goland?-sync/atomic原子操作小結

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

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

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

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

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

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

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

3.CAS

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

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

原子操作劣勢:
   在被操作值被頻繁的變更的情況下,CAS操作并不那么容易成功。因為需要對ild值進行匹配,只有匹配成功了才進行下一步的修改。

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

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

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

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

5.原子操作方法

5.1 atomic.AddInt32--增減

增減,操作方法的命名方式為AddXXX,保證對操作數進行原子的增減,支持的類型為int32、int64、uint32、uint64、uintptr,使用時以AddXXX就是對應的操作方法。

//加
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
}

鎖和原子操作對比:

//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值與當前值是否一致,一致則把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
}

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

相關文章

  • Go設計模式之模板方法模式講解和代碼示例

    Go設計模式之模板方法模式講解和代碼示例

    模版方法是一種行為設計模式, 它在基類中定義了一個算法的框架, 允許子類在不修改結構的情況下重寫算法的特定步驟,本文將通過代碼示例給大家詳細的介紹一下Go模板方法模式,需要的朋友可以參考下
    2023-08-08
  • Go語言中for和range的性能比較

    Go語言中for和range的性能比較

    這篇文章主要為大家詳細介紹了Go語言中for和range語句的使用以及性能比較,文中的示例代碼講解詳細,感興趣的小伙伴可以跟隨小編一起了解一下
    2023-07-07
  • Go+Vue開發(fā)一個線上外賣應用的流程(用戶名密碼和圖形驗證碼)

    Go+Vue開發(fā)一個線上外賣應用的流程(用戶名密碼和圖形驗證碼)

    這篇文章主要介紹了Go+Vue開發(fā)一個線上外賣應用(用戶名密碼和圖形驗證碼),本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-11-11
  • golang?struct?json?tag的使用以及深入講解

    golang?struct?json?tag的使用以及深入講解

    這篇文章主要給大家介紹了關于golang?struct?json?tag的使用以及深入講解,文中通過實例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2022-02-02
  • Golang中的包及包管理工具go?mod詳解

    Golang中的包及包管理工具go?mod詳解

    這篇文章主要介紹了Golang中的包及包管理工具go?mod,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-07-07
  • Ubuntu下安裝Go語言開發(fā)環(huán)境及編輯器的相關配置

    Ubuntu下安裝Go語言開發(fā)環(huán)境及編輯器的相關配置

    這篇文章主要介紹了Ubuntu下安裝Go語言開發(fā)環(huán)境及編輯器的相關配置,編輯器方面介紹了包括Vim和Eclipse,需要的朋友可以參考下
    2016-02-02
  • Go中的條件語句Switch示例詳解

    Go中的條件語句Switch示例詳解

    Go的switch的基本功能和C、Java類似,switch 語句用于基于不同條件執(zhí)行不同動作,每一個 case 分支都是唯一的,從上至下逐一測試,直到匹配為止,對Go條件語句Switch相關知識感興趣的朋友一起看看吧
    2021-08-08
  • Gotify搭建你的消息推送系統(tǒng)

    Gotify搭建你的消息推送系統(tǒng)

    這篇文章主要介紹了Gotify搭建你的消息推送系統(tǒng),今天要分享的是 gotify,是一個用 go 編寫的消息服務端,有需要的朋友可以借鑒參考下,希望能夠有所幫助
    2024-01-01
  • 利用Go語言實現(xiàn)Raft日志同步

    利用Go語言實現(xiàn)Raft日志同步

    這篇文章主要為大家詳細介紹了如何利用Go語言實現(xiàn)Raft日志同步,文中的示例代碼講解詳細,對我們深入了解Go語言有一定的幫助,需要的可以參考一下
    2023-05-05
  • golang內置net/http包的使用詳解

    golang內置net/http包的使用詳解

    在Go語言中,內置的net/http包提供了一種出色的方式來處理HTTP請求和響應,不僅功能強大,而且易于使用,本文將帶大家深入了解Go語言內置的net/http包,揭示其強大的功能和用法,希望對大家有所幫助
    2023-11-11

最新評論