在go語言基本知識點中,我練習了一下互斥鎖,感受仍是有點懵逼狀,接下來爲了弄懂,我再次進行了一些嘗試,如下就是通過個人嘗試後得出的互斥鎖的做用。安全
首先仍是奉上我改造後的代碼:code
package main import ( "fmt" "math/rand" "runtime" "sync" "time" ) func main() { var state = make(map[int]int) var mutex = &sync.Mutex{} for w := 0; w < 100; w++ { go func() { for { key := rand.Intn(5) + 1 val := rand.Intn(100) + 1 mutex.Lock() state[key] = val mutex.Unlock() runtime.Gosched() } }() } time.Sleep(time.Second) mutex.Lock() fmt.Println("state:", state) mutex.Unlock() mutex.Lock() fmt.Println("state:", state) mutex.Unlock() }
以上是我根據原來的練習改造後的代碼,去掉了從state中讀數據的互斥鎖操做和原子計數器,只針對寫數據進行互斥鎖,而且在最後又增長了一次1秒的等待時間,和打印state協程
代碼運行結果以下,會發現兩次寫入數據不一樣:blog
state: map[1:89 5:33 4:81 2:18 3:16] state: map[1:86 5:89 4:82 2:48 3:86]
緣由是,兩次打印,第一次打印時候上鎖,而後此時數據被打印,解鎖以後,go協程還在寫數據,而後第二次打印的數據就跟第一次不一樣了class
互斥鎖的做用就是保證了數據的安全性,上鎖以後就只能有一我的在操做數據,解鎖後才能讓另外的人操做import