1 Golang執行緒安全(簡單例子)

2021-10-10 10:34:54 字數 1764 閱讀 9090

var money int=0

func

add(pint *

int)

}func

addmoney()

time.

sleep

(time.second*5)

fmt.

println

(money)

}

預期結果是100000000,但是由於add方法是協程方式呼叫的,存在併發的情況,導致結果不符合預期。

// 全域性變數

var money int=0

// 初始化鎖

var lock *sync.rwmutex =

new(sync.rwmutex)

func

add2

(pint *

int)

// 解鎖

lock.

unlock()

}func

main()

time.

sleep

(time.second*5)

fmt.

println

(money)

}

這個例子裡,寫操作時加了寫鎖,也就是說整個寫得過程是序列的,也就解決了上面的問題。

// 執行緒安全的佇列

type queue struct

// 長度

lenint

// 鎖

lock *sync.mutex

}// 初始化執行緒安全佇列

func

newqueue()

*queue ,0

,10)// 初始化當前長度

myqueue.

len=

0 myqueue.lock =

new(sync.mutex)

return myqueue

}// 獲取佇列長度,解決了執行緒安全

func

(queue *queue)

len(

)int

// 判斷是否空,解決了執行緒安全

func

(queue *queue)

isempty()

bool

// 彈出第乙個元素,解決了執行緒安全

func

(queue *queue)

shift()

(el inte***ce

)// 第乙個元素、資料

el, queue.data = queue.data[0]

, queue.data[1:

]return

}// 壓入元素,解決了執行緒安全

func

(queue *queue)

push

(el inte***ce

)// 獲取第乙個元素,解決了執行緒安全

func

(queue *queue)

front()

inte***ce

return queue.data[0]

}// 獲取最後乙個元素,解決了執行緒安全

func

(queue *queue)

end(

)inte***ce

return queue.data[queue.

len()-

1]}

仿照了上面的思想,在每個讀寫操作的時都加上讀寫鎖,這樣子就可以實現佇列的執行緒安全。

Golang筆記 1 Golang安裝與配置

一 macos 3 建立gopath路徑 home go 4 配置環境變數 cd vim bash profile export goroot usr local go export path path goroot export gopath home go 二 linux wget sudo t...

golang執行緒安全

目錄 不安全,需要進行資源保護。sync互斥鎖,或者redis分布式鎖 或者 這個字典型別提供了一些常用的鍵值訪問操作方法,並保證了這些操作的併發安全 var ma sync.map 該型別是開箱即用,只需要宣告既可 ma.store key value 儲存值 ma.delete key 刪除值 ...

執行緒安全問題例子

面試題總是會問寫乙個執行緒安全問題的例子,最簡單的就是多執行緒操作同乙個成員變數,而且方法沒有加鎖 如下 import j a.util.concurrent.completablefuture import j a.util.concurrent.countdownlatch author yid...