美文网首页
25.Go语言·协程Goroutine·全局变量加锁

25.Go语言·协程Goroutine·全局变量加锁

作者: 一枼落知天下 | 来源:发表于2019-06-11 19:32 被阅读0次

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()
}

相关文章

网友评论

      本文标题:25.Go语言·协程Goroutine·全局变量加锁

      本文链接:https://www.haomeiwen.com/subject/icscfctx.html