1、同步/异步:
** 同步:sync**
one by one 一个接一个,串行
异步:async
并行,同时执行
异步任务:
同时执行,“并发”。
2、WaitGroup: 同步等待组
执行了wait的goroutine,要等待同步等待组中其他的goroutine执行完毕。
内置计数器:
- 初始值为:counter:0
- 要执行的goroutine的数量
**Add(3), **设置计数器的数量, 设置counter的值
** Done(), **将内置的计数器的数值减1。同add(-1) counter的值-1
**Wait(), **等待,导致执行wait的goroutine进入阻塞状态。同步等待组中的计数器的值为0,解除阻塞。
Add(3),三个goroutine要执行
…
子goroutine:函数,最后一行Done() 计数器减1
wait() 主程序等待
1 | package main |
3、互斥锁:
- ** 并发读取全局数据时,会出问题,利用”锁”解决问题。**
开 / 关,”上厕所”的例子
- 锁头对象 (struct)
- 互斥:锁定—解锁
- 有两个指针方法
- Lock(),上锁
- 阻塞的:只能有一个goroutine上锁,其他的goroutine处于阻塞状态。
- Unlock(),开锁
- Lock(),上锁
- 有两个指针方法
3.1、可能存在问题的案例:
银行存钱问题,同时进行,在读取完后,未来得及写入的情况下,又进行了读取… … ****
1 | package main |
结果:
1 | 售票厅4 : 49 |
3.2、****互斥锁:
1 | package main |
结果:
1 | main,即将锁定mutex |
3.3、利用互斥锁解决上述问题
1 | package main |
结果:
1 | 售票厅1 : 50 |
⚠️注意:
** 需要 对c#j进阶课的异步多线程的互斥锁进一步加强!**
- 本文作者: 梁俊可
- 本文链接: http://ljk3d.com/2021/10/19/goLangNote/goLangBasic/15_GoLang语言入门_基础语法_并发与多线程04_WaitGroup和互斥锁/
- 版权声明: 梁俊可工作室