go 的线程锁

package main
import (
	"fmt"
	"time"
	_ "time"
	"sync"
)

/*需求:现在要计算 1-200 的各个数的阶乘,并且把各个数的阶乘放入到map中。
最后显示出来。要求使用goroutine完成

思路
1. 编写一个函数,来计算各个数的阶乘,并放入到 map中.
2. 我们启动的协程多个,统计的将结果放入到 map中
3. map 应该做出一个全局的.*/

var (
	myMap = make(map[int]int, 10)
	//声明一个全局的互斥锁
	//lock 是一个全局的互斥锁,
	//sync 是包: synchornized 同步
	//Mutex : 是互斥
	lock sync.Mutex
)

// test 函数就是计算 n!, 让将这个结果放入到 myMap
func test(n int) {
	res := 1
	for i := 1; i <= n; i++ {
		res += i
	}

	//这里我们将 res 放入到myMap
	//加锁
	lock.Lock()
	myMap[n] = res //concurrent map writes?
	//解锁
	lock.Unlock()
}

func main() {

	// 我们这里开启多个协程完成这个任务[200个]
	for i := 1; i <= 100; i++ {
		go test(i)
	}
	//休眠10秒钟【第二个问题 】
	time.Sleep(time.Second * 50)

	//这里我们输出结果,变量这个结果
	//lock.Lock()
	for i, v := range myMap {
		fmt.Printf("map[%d]=%d\n", i, v)
	}
	//lock.Unlock()

}
posted @ 2022-03-12 17:05  ty1539  阅读(281)  评论(0编辑  收藏  举报