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

相关文章
相关标签/搜索