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

Go語言開發(fā)保證并發(fā)安全實(shí)例詳解

 更新時間:2022年09月02日 09:09:52   作者:Sundar84034  
這篇文章主要為大家介紹了Go語言開發(fā)保證并發(fā)安全實(shí)例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪

什么是并發(fā)安全?

高并發(fā)場景下,進(jìn)程、線程(協(xié)程)可能會發(fā)生資源競爭,導(dǎo)致數(shù)據(jù)臟讀、臟寫、死鎖等問題,為了避免此類問題的發(fā)生,就有了并發(fā)安全。

這里舉一個簡單的例子:

 var data int 
 go func() {
   data++ 
 }() 
 if data == 0 { 
   fmt.Printf("the value is %v.\n", data) 
 }

在這段代碼中

第2行g(shù)o關(guān)鍵字開啟了一個新的協(xié)程,來執(zhí)行data++操作

第5行,對data變量進(jìn)行了讀取判斷的操作

以上兩部是由2個不同線程/協(xié)程運(yùn)行,且沒有任何措施保證執(zhí)行順序,所以執(zhí)行結(jié)果是不確定的。

  • 沒有輸出。(第3行是在第5行之前執(zhí)行的)
  • 輸出 the value is 0。(第5行和第6行在第3行之前執(zhí)行)
  • 輸出 the value is 1。(第5行在第3行之前執(zhí)行,但第3行在第6行之前執(zhí)行)

Go如何保證并發(fā)安全

目前了解到的,大概有這3種,Mutex、Channel、Atomic

Mutex

加鎖應(yīng)該是最常見的并發(fā)控制方法,一般分成兩種,樂觀鎖和悲觀鎖。

鎖是由操作系統(tǒng)的調(diào)度器來實(shí)現(xiàn)的,鎖通常用來保護(hù)一段邏輯,

悲觀鎖

悲觀鎖是一種悲觀思想,它總認(rèn)為最壞的情況可能會出現(xiàn)。不管意料之外的結(jié)果是否會發(fā)生,只要存在發(fā)生的可能,就在操作這個資源之前先上鎖。例如互斥鎖、讀寫鎖都是悲觀鎖。

在go中,除了automic,其它都是悲觀鎖

悲觀鎖應(yīng)該都是由操作系統(tǒng)的調(diào)度器來實(shí)現(xiàn)的,通常用來保護(hù)一段邏輯,主要是通過阻塞其它線程,保證當(dāng)前時刻只有一個線程在對資源進(jìn)行操作,因此性能相對較差,浪費(fèi)了計(jì)算機(jī)多核的優(yōu)勢。

樂觀鎖

樂觀鎖的思想與悲觀鎖的思想相反,它總認(rèn)為資源和數(shù)據(jù)不會被別人所修改,所以讀取不會上鎖,但是樂觀鎖在進(jìn)行寫入操作的時候會判斷當(dāng)前數(shù)據(jù)是否被修改過

樂觀鎖的實(shí)現(xiàn)方案主要包含CAS版本號機(jī)制。

樂觀鎖適用于多讀的場景,可以提高吞吐量。

版本號機(jī)制

通過在數(shù)據(jù)表中,增加一個版本號字段,當(dāng)數(shù)據(jù)發(fā)生更新時,版本號值發(fā)生改變。 例如一個線程A想要更新變量s的值,在讀取s的值的同時讀取版本號,在提交更新時,用之前讀到的版本號值與當(dāng)前的版本號值進(jìn)行比對,當(dāng)且僅當(dāng)版本號值一致時,才會觸發(fā)更新,否則不斷進(jìn)行重試,直到更新成功。

CAS

CAS全名為Compare And Swap,即比較與轉(zhuǎn)換,是一種有名的無鎖算法。在不使用鎖的情況下,實(shí)現(xiàn)多線程之間的變量同步,也就是在沒有線程被阻塞的情況下實(shí)現(xiàn)變量的同步,所以也叫非阻塞同步,

互斥鎖

GO使用Sync包的Mutex類型來實(shí)現(xiàn)互斥鎖,它能保證同時只有一個goroutine可以訪問資源。

func sample() {
	var l sync.Mutex
	l.Lock()
        defer l.Unlock()
	// so something
}

讀寫互斥鎖

GO使用Sync包的RWMutex類型來實(shí)現(xiàn)互斥鎖。當(dāng)我們?nèi)ゲl(fā)的讀取一個資源,只要數(shù)據(jù)沒有發(fā)生寫入,是沒必要加鎖的。因此讀多寫少的情況下,使用讀寫互斥鎖是更好的選擇,性能更好。

讀寫鎖分為兩種:讀鎖和寫鎖。

當(dāng)一個goroutine獲取讀鎖之后,其他的goroutine如果是獲取讀鎖可以順利獲得,如果是獲取寫鎖就會等待;

當(dāng)一個goroutine獲取寫鎖之后,其他的goroutine無論是獲取讀鎖還是寫鎖都會等待。

package main
import (
	"fmt"
	"sync"
	"time"
)
var (
	wg     sync.WaitGroup
	rwlock sync.RWMutex
)
func write() {
	rwlock.Lock() // 加寫鎖
	time.Sleep(10 * time.Millisecond)
	rwlock.Unlock() // 解寫鎖
	wg.Done()
}
func read() {
	rwlock.RLock() // 加讀鎖
	time.Sleep(time.Millisecond)
	rwlock.RUnlock() // 解讀鎖
	wg.Done()
}
func main() {
	start := time.Now()
	//讀多
	for i := 0; i < 1000; i++ {
		wg.Add(1)
		go read()
	}
	//寫少
	for i := 0; i < 10; i++ {
		wg.Add(1)
		go write()
	}
	wg.Wait()
	end := time.Now()
	fmt.Println(end.Sub(start))
}

以上就是Go語言開發(fā)保證并發(fā)安全實(shí)例詳解的詳細(xì)內(nèi)容,更多關(guān)于Go保證并發(fā)安全的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Go interface接口聲明實(shí)現(xiàn)及作用詳解

    Go interface接口聲明實(shí)現(xiàn)及作用詳解

    這篇文章主要為大家介紹了Go interface接口聲明實(shí)現(xiàn)及作用詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-03-03
  • 實(shí)現(xiàn)像php一樣方便的go ORM數(shù)據(jù)庫操作示例詳解

    實(shí)現(xiàn)像php一樣方便的go ORM數(shù)據(jù)庫操作示例詳解

    這篇文章主要為大家介紹了實(shí)現(xiàn)像php一樣方便的go ORM數(shù)據(jù)庫操作示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-12-12
  • go責(zé)任鏈行為型設(shè)計(jì)模式Chain?Of?Responsibility

    go責(zé)任鏈行為型設(shè)計(jì)模式Chain?Of?Responsibility

    這篇文章主要為大家介紹了go行為型設(shè)計(jì)模式之責(zé)任鏈Chain?Of?Responsibility使用示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-12-12
  • 基于HLS創(chuàng)建Golang視頻流服務(wù)器的優(yōu)缺點(diǎn)

    基于HLS創(chuàng)建Golang視頻流服務(wù)器的優(yōu)缺點(diǎn)

    HLS 是 HTTP Live Streaming 的縮寫,是蘋果開發(fā)的一種基于 HTTP 的自適應(yīng)比特率流媒體傳輸協(xié)議。這篇文章主要介紹了基于 HLS 創(chuàng)建 Golang 視頻流服務(wù)器,需要的朋友可以參考下
    2021-08-08
  • 淺談Go Channel 高級實(shí)踐

    淺談Go Channel 高級實(shí)踐

    這篇文章主要介紹了淺談Go Channel 高級實(shí)踐,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-08-08
  • golang操作elasticsearch的實(shí)現(xiàn)

    golang操作elasticsearch的實(shí)現(xiàn)

    這篇文章主要介紹了golang操作elasticsearch,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-06-06
  • golang封裝一個執(zhí)行命令行的函數(shù)(return?stderr/stdout/exitcode)示例代碼

    golang封裝一個執(zhí)行命令行的函數(shù)(return?stderr/stdout/exitcode)示例代碼

    在?Go?語言中,您可以使用?os/exec?包來執(zhí)行外部命令,不通過調(diào)用?shell,并且能夠獲得進(jìn)程的退出碼、標(biāo)準(zhǔn)輸出和標(biāo)準(zhǔn)錯誤輸出,下面給大家分享golang封裝一個執(zhí)行命令行的函數(shù)(return?stderr/stdout/exitcode)的方法,感興趣的朋友跟隨小編一起看看吧
    2024-06-06
  • golang整合日志zap的實(shí)現(xiàn)示例

    golang整合日志zap的實(shí)現(xiàn)示例

    Go語言中的zap庫提供了強(qiáng)大的日志管理功能,支持日志記錄到文件、日志切割、多日志級別、結(jié)構(gòu)化日志輸出等,它通過三種方法zap.NewProduction()、zap.NewDevelopment()和zap.NewExample(),快速構(gòu)建適用于不同環(huán)境的logger,感興趣的可以了解一下
    2024-10-10
  • Golang單元測試與斷言編寫流程詳解

    Golang單元測試與斷言編寫流程詳解

    這篇文章主要介紹了Golang單元測試與斷言編寫流程,單元測試也是一個很重要的事情。單元測試是指在開發(fā)中,對一個函數(shù)或模塊的測試。其強(qiáng)調(diào)的是對單元進(jìn)行測試
    2022-12-12
  • 淺析Go語言中的map數(shù)據(jù)結(jié)構(gòu)是如何實(shí)現(xiàn)的

    淺析Go語言中的map數(shù)據(jù)結(jié)構(gòu)是如何實(shí)現(xiàn)的

    在?Go?中,map?是一種用于存儲鍵值對的數(shù)據(jù)結(jié)構(gòu),它提供了一種快速查找和訪問數(shù)據(jù)的方式,下面我們就來看看Go語言中是如何實(shí)現(xiàn)map數(shù)據(jù)結(jié)構(gòu)的吧
    2024-03-03

最新評論

阿鲁科尔沁旗| 申扎县| 清远市| 娱乐| 永兴县| 孝义市| 大方县| 尚志市| 桐梓县| 清水河县| 柘荣县| 盐城市| 拉萨市| 马龙县| 龙川县| 阿克苏市| 青海省| 木兰县| 墨竹工卡县| 沾益县| 乐都县| 炎陵县| 梨树县| 建湖县| 久治县| 赣州市| 焦作市| 阳曲县| 双城市| 弥勒县| 贺州市| 林甸县| 堆龙德庆县| 济宁市| 永新县| 贞丰县| 牡丹江市| 高台县| 余姚市| 九龙县| 郸城县|