golang中mutex使用
阅读原文时间:2022年04月06日阅读:1

package main

import (
"fmt"
"sync"
"time"
)

/*
高并发是golang语言最大的亮点
一个线程可以包含多个协程,共享堆不共享栈
协程一般由应用程序显示实现调度,上下文切换不需下到内核层,高效不少
golang中实现协程间通讯有两种方式:
(1)共享内存型:使用全局变量+mutex锁实现数据共享
(2)消息传递型:使用一种独有的channel机制实现异步通讯
*/

var mutex sync.Mutex
var ret = 0

func main() {
// golang中多协程共享全局变量,如果需要修改全局变量就需要加锁
go task()
for i := 0; i < 1000000; i++ {
mutex.Lock()
ret++
mutex.Unlock()
}
time.Sleep(time.Second)
fmt.Println(ret) // 2000000
}

func task() {
for i := 0; i < 1000000; i++ {
mutex.Lock()
ret++
mutex.Unlock()
}
}