1) 單執行緒
2) Init 函式
如果包P1中匯入了包P2,則P2中的init函式Happens Before 所有P1中的操作
main函式Happens After 所有的init函式
3) Goroutine
Goroutine的創建Happens Before所有此Goroutine中的操作
Goroutine的銷毀Happens After所有此Goroutine中的操作
4) Channel
對一個元素的send操作Happens Before對應的receive 完成操作 , [先發后接]
對channel的close操作Happens Before receive 端的收到關閉通知操作 [先關后接,接到零值]
對于無緩沖channel(unbuffered Channel),對一個元素的receive 操作Happens Before對應的send完成操作 [先接后發]
對于Buffered Channel,假設Channel 的buffer 大小為C,那么對第k個元素的receive操作,Happens Before第k+C個send完成操作,可以看出上一條Unbuffered Channel規則就是這條規則C=0時的特例 [先接后發]
5) Lock
Go里面有Mutex和RWMutex兩種鎖,RWMutex除了支持互斥的Lock/Unlock,還支持共享的RLock/RUnlock,
對于一個Mutex/RWMutex,設n < m,則第n個Unlock操作Happens Before第m個Lock操作,
對于一個RWMutex,存在數值n,RLock操作Happens After 第n個UnLock,其對應的RUnLock Happens Before 第n+1個Lock操作,
簡單理解就是這一次的Lock總是Happens After上一次的Unlock,讀寫鎖的RLock HappensAfter上一次的UnLock,其對應的RUnlock Happens Before 下一次的Lock,
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/241698.html
標籤:Go
上一篇:git原理學習記錄:從基本指令到背后原理,實作一個簡單的git
下一篇:Go語言基礎
