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...