<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
在高並行場景下,程序、執行緒(協程)可能會發生資源競爭,導致資料髒讀、髒寫、死鎖等問題,為了避免此類問題的發生,就有了並行安全。
這裡舉一個簡單的例子:
var data int go func() { data++ }() if data == 0 { fmt.Printf("the value is %v.n", data) }
在這段程式碼中
第2行go關鍵字開啟了一個新的協程,來執行data++操作
第5行,對data變數進行了讀取判斷的操作
以上兩部是由2個不同執行緒/協程執行,且沒有任何措施保證執行順序,所以執行結果是不確定的。
Go如何保證並行安全
目前瞭解到的,大概有這3種,Mutex、Channel、Atomic
加鎖應該是最常見的並行控制方法,一般分成兩種,樂觀鎖和悲觀鎖。
鎖是由作業系統的排程器來實現的,鎖通常用來保護一段邏輯,
悲觀鎖是一種悲觀思想,它總認為最壞的情況可能會出現。不管意料之外的結果是否會發生,只要存在發生的可能,就在操作這個資源之前先上鎖。例如互斥鎖、讀寫鎖都是悲觀鎖。
在go中,除了automic,其它都是悲觀鎖
悲觀鎖應該都是由作業系統的排程器來實現的,通常用來保護一段邏輯,主要是通過阻塞其它執行緒,保證當前時刻只有一個執行緒在對資源進行操作,因此效能相對較差,浪費了計算機多核的優勢。
樂觀鎖的思想與悲觀鎖的思想相反,它總認為資源和資料不會被別人所修改,所以讀取不會上鎖,但是樂觀鎖在進行寫入操作的時候會判斷當前資料是否被修改過。
樂觀鎖的實現方案主要包含CAS和版本號機制。
樂觀鎖適用於多讀的場景,可以提高吞吐量。
通過在資料表中,增加一個版本號欄位,當資料發生更新時,版本號值發生改變。 例如一個執行緒A想要更新變數s的值,在讀取s的值的同時讀取版本號,在提交更新時,用之前讀到的版本號值與當前的版本號值進行比對,當且僅當版本號值一致時,才會觸發更新,否則不斷進行重試,直到更新成功。
CAS全名為Compare And Swap,即比較與轉換,是一種有名的無鎖演演算法。在不使用鎖的情況下,實現多執行緒之間的變數同步,也就是在沒有執行緒被阻塞的情況下實現變數的同步,所以也叫非阻塞同步,
GO使用Sync包的Mutex型別來實現互斥鎖,它能保證同時只有一個goroutine可以存取資源。
func sample() { var l sync.Mutex l.Lock() defer l.Unlock() // so something }
GO使用Sync包的RWMutex型別來實現互斥鎖。當我們去並行的讀取一個資源,只要資料沒有發生寫入,是沒必要加鎖的。因此讀多寫少的情況下,使用讀寫互斥鎖是更好的選擇,效能更好。
讀寫鎖分為兩種:讀鎖和寫鎖。
當一個goroutine獲取讀鎖之後,其他的goroutine如果是獲取讀鎖可以順利獲得,如果是獲取寫鎖就會等待;
當一個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語言開發保證並行安全範例詳解的詳細內容,更多關於Go保證並行安全的資料請關注it145.com其它相關文章!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45