main.go
// Go语言·管道Channel
package main
import (
model "day31/model"
)
var content string = `
————————————————Go语言·协程Goroutine————————————————————
一、协程
1.全局变量加锁[互斥锁],同步改进程序
sync包提供了基本的同步基元,
如互斥锁。除了Once和WaitGroup类型,
大部分都是适用于低水平程序线程,
高水平的同步使用channel通信更好一些。
`
func main() {
model.Entry()
}
model/Utils.go
package model
import (
"fmt"
"sync"
"time"
)
var (
result = make(map[int]int, 10)
// lock 是一个全局的互斥锁
// sync包提供了基本的同步基元
// Mutex互斥
lock sync.Mutex
)
/**
* [Init 入口]
* @author Jhou Shuai
* @datetime 2019-05-18T11:58:33+0800
*/
func Entry() {
solutionLock()
}
func solutionLock() {
// 开启多个协程
// 200个协程同时写入在操作一个map ,同一块内存
// fatal error: concurrent map writes
// 资源竞争
// 排队[协程1,协程2,协程3...]
// 加锁lock
// Map
// 解锁unlock
for i := 1; i <= 20; i++ {
go test(i)
}
// 这里有问题:需要休眠等待 协程执行完成
time.Sleep(time.Second*5)
lock.Lock()
// 没有结果的,主进程执行完咯
for key, val := range result {
fmt.Printf("map[%d] = %d \n", key, val)
}
lock.Unlock()
}
// 计算n的阶乘,并将结果放入到result中
func test(n int) {
res := 1
for i := 1; i <= n; i++ {
res *= i
}
// 加锁
lock.Lock()
// fatal error: concurrent map writes
result[n] = res
// 解锁
lock.Unlock()
}