1) 單線程app
2) Init 函數函數
若是包P1中導入了包P2,則P2中的init函數Happens Before 全部P1中的操做
main函數Happens After 全部的init函數
3) Goroutine線程
Goroutine的建立Happens Before全部此Goroutine中的操做
Goroutine的銷燬Happens After全部此Goroutine中的操做
4) Channelit
對一個元素的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) Lockchannel
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。