006_go语言中的互斥锁的作用练习与思考

在go语言基本知识点中,我练习了一下互斥锁,感觉还是有点懵逼状,接下来为了弄懂,我再次进行了一些尝试,以下就是经过我的尝试后得出的互斥锁的作用。

首先还是奉上我改造后的代码:

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

代码运行结果如下,会发现两次写入数据不同:

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协程还在写数据,然后第二次打印的数据就跟第一次不同了

互斥锁的作用就是保证了数据的安全性,上锁之后就只能有一个人在操作数据,解锁后才能让另外的人操作

posted @ 2018-04-17 22:24  Joestar  阅读(405)  评论(0编辑  收藏  举报