golangb并发,Sync包中Mutes,WaitGroup, NewCond的适应

几个demo来学习和演示sync包的使用。

go 复制代码
package lockdemo

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

var sum int = 0
var lock sync.Mutex
var rwlock sync.RWMutex
var wg sync.WaitGroup

func add(i int) {
	lock.Lock()
	defer lock.Unlock()
	sum += i
}

func readSum() int {

	//只获取读锁
	rwlock.RLock()
	defer rwlock.RUnlock()
	b := sum

	return b

}

func run() {

	//因为要监控110个协程,所以设置计数器为110
	wg.Add(110)
	for i := 0; i < 100; i++ {
		go func() {
			//计数器值减1
			defer wg.Done()
			add(10)
		}()
	}

	for i := 0; i < 10; i++ {
		go func() {
			//计数器值减1
			defer wg.Done()
			fmt.Println("和为:", readSum())
		}()
	}

	//一直等待,只要计数器值为0
	wg.Wait()
}

// 只执行一次
// 适用于创建某个对象的单例、只加载一次的资源等只执行一次的场景
func doOnce() {
	var once sync.Once
	onceBody := func() {
		fmt.Println("Only once")
	}

	//用于等待协程执行完毕
	done := make(chan bool)

	//启动10个协程执行once.Do(onceBody)
	for i := 0; i < 10; i++ {
		go func() {
			//把要执行的函数(方法)作为参数传给once.Do方法即可
			once.Do(onceBody)
			done <- true
		}()
	}

	for i := 0; i < 10; i++ {
		<-done
	}
}

// 10个人赛跑,1个裁判发号施令
// 适用于需要等待多个协程完成某个任务的场景
func race() {

	cond := sync.NewCond(&sync.Mutex{})
	var wg sync.WaitGroup
	wg.Add(11)

	for i := 0; i < 10; i++ {
		go func(num int) {
			defer wg.Done()
			fmt.Println(num, "号已经就位")
			cond.L.Lock()
			cond.Wait() //等待发令枪响
			fmt.Println(num, "号开始跑......")
			cond.L.Unlock()
		}(i)
	}

	//等待所有goroutine都进入wait状态
	time.Sleep(2 * time.Second)

	go func() {
		defer wg.Done()
		fmt.Println("裁判已经就位,准备发令枪")
		fmt.Println("比赛开始,大家准备跑")
		cond.Broadcast() //发令枪响,唤起所有的协程、Signal,唤醒一个等待时间最长的协程。
	}()
	//防止函数提前返回退出
	wg.Wait()
}
相关推荐
GEO从入门到精通3 小时前
课程怎么选?2026年GEO学习资源全梳理
学习
优化Henry4 小时前
LTE 载波频率与频点配置详解
运维·网络·学习·5g·信息与通信
xiaomu001234 小时前
高湿环境床垫湿度管理技术框架:湿度阈值、排湿结构与材料选型
经验分享·学习·学习方法
zhangrelay5 小时前
ROS项目设计案例智能大模型正经乱答案例
linux·笔记·学习·ubuntu·机器人
probex_5 小时前
学习笔记:知识图谱是什么,在测试里能干什么
笔记·学习·知识图谱
每天题库8 小时前
危险货物道路运输从业资格证题库刷题重点与错题梳理
学习·安全·考试·题库·考证
m4Rk_8 小时前
【论文阅读】Agent 记忆机制(86):Skill-Pro——用 Non-Parametric PPO 将交互经验演化为可复用技能
论文阅读·人工智能·学习·开源·github
AOI小白新手上路8 小时前
从 Keil 调试视角看 51 指针,到 Cortex-M 内存映射访问寄存器 · 学习笔记
笔记·学习
Joe_Wang59 小时前
【从0到1学习JVM · 15】对象在堆里来回倒腾,究竟怎样才会进老年代?
java·jvm·学习·垃圾回收
软件开发技术深度爱好者10 小时前
中学生学习工具:多学科自学启导者(轻量版)实现
学习·ai·技术实践