併發安全和鎖

2021-10-22 18:28:55 字數 634 閱讀 7426

有時候在go**中可能會存在多個goroutine同時操作乙個資源,這種情況會發生資料競態問題。

舉例:

var x int64

var wg sync.waitgroup

func add()

wg.done()

}func main()

上面的**中開啟了 2 個goroutine去累加變數x的值,這 2 個goroutine在訪問和修改x變數的時候存在資料競爭,導致最後的結果與期待的不符。

互斥鎖互斥鎖是一種常用的控制共享資源訪問的方法,它能夠保證同時只有乙個goroutine可以訪問共享資源。go語言使用sync包的mutex型別來實現互斥鎖。

var lock sync.mutex

func add()

wg.done()

}

使用互斥鎖能夠保證同一時間有且只有乙個goroutine進入臨界區,其他的goroutine則在等待;多個goroutine同時等待乙個鎖時,喚醒的策略是隨機的。

讀寫互斥鎖

很多實際的場景下是讀多寫少,併發的去讀取乙個資源不涉及修改的時候沒有必要加鎖,這種場景下使用讀寫鎖是更好的一種選擇。讀寫鎖在go語言中使用sync包的rwmutex型別。

C 併發處理 鎖OR執行緒安全?

每次寫部落格,第一句話都是這樣的 程式設計師很苦逼,除了會寫程式,還得會寫部落格!當然,題外話說多了,咱進入正題!背景 基於任務的程式設計 命令式資料並行和任務並行都要求能夠支援併發更新的陣列 列表和集合。在.net framework 4 以前,為了讓共享的陣列 列表和集合能夠被多個執行緒更新,需...

golang 之sync 併發安全鎖

讓乙個程式併發安全並不需要其中的每乙個具體型別都是併發安全的。實際上併發安全的型別其實是特例而不是普遍存在的,所以僅在文件指出型別是安全的情況下,才可以併發的訪問乙個變數。與之對應的是,匯出的包級別函式通常可以認為是併發安全的。因為包級別的變數無法限制在乙個goroutine內。所以那些修改這些變數...

高併發和鎖

面試被問到了這個問題,找了答案,記錄一下 假如有100w個使用者,搶一張票,除了負載均衡的辦法,怎麼支援高併發?修改字段 將庫存欄位number欄位設為unsigned,當庫存為0時,因為字段不能為負數,將會返回false 利用悲觀鎖 不適合高併發 悲觀鎖,也就是在修改資料的時候,採用鎖定狀態,排斥...