golang 併發 共享資源安全

2022-09-09 23:12:23 字數 2272 閱讀 5676

首先,我們需要知道:在golang中,多 goroutine 同時操作乙個共享資源時;我們需要保障資源的安全(我們對資源的操作結果要符合我們的預期);

當我們未對資源做保護操作時,多個goroutine同時操作同一資源時,就可能會出現問題;

例如 count=1 ,有a、b兩個 goroutine 同時拿到資源 count 變數,再對 count 進行更新操作,

然後再列印count;

a 拿到 count 變數(資源)時,count 等於1,

b 拿到 count 變數(資源)時,count 也等於1,

a 對於變數操作一次(進行一次 +1 ),這是 count 就等於2了,count的值被修改成2 ;

b 對於變數操作兩次(進行兩次 +1 ),這是 count 就等於3了,count的值被修改成3 ;

若 a 先執行完,則 b: count 的值被修改成3;為 count 的最後一次更新,count列印 就為 3;

若 b 先執行完,則 a: count 的值被修改成2;為 count 的最後一次更新,count列印 就為 2;

如若想資源被操作、更新後的結果符合我們的預期,我們就需要使用到鎖,在 golang sync 包中,可以找到相關使用介紹,較為常用的鎖相關有 sync.map(同步map,併發安全),sync.mutex(互斥鎖),sync.rwmutex(讀寫鎖)。

舉個例子,上**:

package main

import "fmt"

var count = 0

func main()

fmt.println("count:", count)

}func addone()

/* 輸出結果

count: 1000

*/

多次執行,輸出結果

執行多次,都不符合預期-

注意:如果符合預期1000,可能時電腦效能導致的《我設定成100時,與未多併發程式結果一致》,可加大測試for迴圈次數,多次驗證

執行多次 結果一致

** 注意:** 這裡我故意將迴圈次數調整至 100000 ,以避免一定的偶然性

常見寫法

package main

import (

"fmt"

"sync"

)// 將計數、互斥鎖(count、sync.mutex)放入結構體中

type count struct

var count count

func main()

for i := 0; i < 100000; i++ ()

} wg.wait()

fmt.println("count:", count.count)

}func addone()

總結:

多併發程式,需要多注意臨界區(共享)資源的更新問題;

未編寫單元測試;總覺得該測試不夠正規的;哈哈~

執行緒安全與共享資源

自併發程式設計網 ifeve.com 執行緒安全與共享資源 畢冉校對 丁一 允許被多個執行緒同時執行的 稱作執行緒安全的 執行緒安全的 不包含競態條件。當多個執行緒同時更新共享資源時會引發競態條件。因此,了解j a執行緒執行時共享了什麼資源很重要。public void somemethod pub...

java 共享資源

防止任務在共享資源上產生衝突除了加鎖的第二種方式是 color red 對變數的共享 color 執行緒本地儲存是一種自動化機制,可以為使用相同變數的每個不同執行緒都建立不懂的儲存。public class threadlocalvariableholder public static void i...

執行緒併發共享資源同步原理解析1

儲存訪問的不一致原因 a cpu訪問儲存的方式 多級儲存 b cpu執行指令的方式 亂序 synchronized給出的答案是在軟體層面依賴jvm,而lock給出的方案是在硬體層面依賴特殊的cpu指令。新請求鎖的執行緒將首先被加入到contentionlist中,當某個擁有鎖的執行緒 owner狀態...