在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