006_go語言中的互斥鎖的做用練習與思考

在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

相關文章
相關標籤/搜索