66 Star 402 Fork 483

infraboard/go-course

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
文件
克隆/下载
perblem.go 1.23 KB
一键复制 编辑 原始数据 按行查看 历史
Mr.Yu 提交于 2021-08-08 18:53 +08:00 . 更新课件
package lock
import (
"fmt"
"sync"
"sync/atomic"
"time"
)
var (
sumCount int64
lock sync.Mutex
)
// 普通版加函数
func add() {
sumCount = sumCount + 1
wg.Done()
}
// 互斥锁版加函数
func mutexAdd() {
lock.Lock()
sumCount = sumCount + 1
lock.Unlock()
wg.Done()
}
// 原子操作版加函数
func atomicAdd() {
atomic.AddInt64(&sumCount, 1)
wg.Done()
}
func ProblemV1() {
var sum int
// 使用WaitGroup等待1000个goroutine完成
var wg sync.WaitGroup
wg.Add(1000)
for i := 0; i < 1000; i++ {
go func() {
defer wg.Done()
// 对变量count执行1000次加1
for j := 0; j < 10; j++ {
lock.Lock()
sum++
lock.Unlock()
}
}()
}
// 等待10个goroutine完成
wg.Wait()
// 结果出错,而且不稳定。
fmt.Println(sum)
}
func ProblemV2() {
// 目的是 记录程序消耗时间
start := time.Now()
defer func() {
fmt.Println(time.Since(start))
}()
for i := 0; i < 1000000; i++ {
wg.Add(1)
// go mutexAdd() // 互斥锁的 add函数 是并发安全的,因为拿不到互斥锁会阻塞,所以加锁性能开销大
go atomicAdd() // 原子操作的 add函数 是并发安全,性能优于加锁的
}
// 等待10个goroutine完成
wg.Wait()
fmt.Println(sumCount)
}
Loading...
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化
Go
1
https://gitee.com/infraboard/go-course.git
git@gitee.com:infraboard/go-course.git
infraboard
go-course
go-course
20dd46295900

搜索帮助