<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
1.加鎖代價比較高,耗時多,需要上下文切換。加鎖解鎖在程式碼層實現,而程式碼是執行在使用者態空間中,對底層進行操作時需要從使用者態空間切換到核心空間,再由核心操作底層資源。耗時多
2.原子操作在使用者態可以完成,效能比互斥鎖高。原子操作在cpu層面支援的,cpu可以直接操作底層資源
3.原子操作需求步驟簡單,無需加鎖解鎖步驟
1.原子操作快,是因為依賴於cpu指令,而不是依賴外部鎖。不會額外的上下文切換
2.原子操作能夠保證執行期間是連續且不會被中斷(變數不會被其他修改,mutex可能存在被其他修改的情況)
CAS是cpu硬體同步原語,是Compare And Swap的縮寫(比較並交換),原子操作中CAS,再sync/atomic包中,全部以ComparAndSwap開頭的函數名都是CAS操作
go中CAS操作,是借用CPU提供的原子性指令來實現。CAS操作修改共用變數時,不需要對共用變數加鎖,而是通過類似樂觀鎖的方式進行檢查,本質還是不斷的佔用CPU資源換取加鎖帶來的開銷(如上下文切換時間開銷)。
原子操作優勢:
可以在不形成臨界區和建立互斥量的情況下完成並行安全的值替換操作。這可以大大的減少同步對程式效能的損耗。
原子操作劣勢:
在被操作值被頻繁的變更的情況下,CAS操作並不那麼容易成功。因為需要對ild值進行匹配,只有匹配成功了才進行下一步的修改。
當前atmomic包有以下幾種原子操作:
Add,ComparAndSwap,Load,Store,Swap
互斥鎖目的:互斥鎖是用來保護一段邏輯的,保證並行安全。(比如運算元據庫保護)
原子操作目的:原子操作作用於一個變數的更新保護,保證並行安全(比如運算元據庫不能原子操作)
mutex底層實現:mutex由作業系統的排程器實現
原子操作底層實現:由底層硬體指令直接提供支援,這些指令在執行過程中不允許中斷,因此原子操作可以在無鎖的情況下保證並行安全,效能隨cpu的數量增多而線性擴充套件。
增減,操作方法的命名方式為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秒 }
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 }
func demo3() { var count int32 = 0 atomic.StoreInt32(&count, 666) fmt.Println(count) //666 }
func demo3() { var count int32 = 0 atomic.StoreInt32(&count, 666) val := atomic.LoadInt32(&count) fmt.Println(val) //666 }
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原子操作內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援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