sync.Mutex 与 sync.WaitGroup 使用示例
Posted 东海陈光剑
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了sync.Mutex 与 sync.WaitGroup 使用示例相关的知识,希望对你有一定的参考价值。
使用 sync.Mutex 与 sync.WaitGroup
线程不安全的用法:
var wg sync.WaitGroup
count := 0
for i := 0; i < 10; i++
// wg add 1 goroutine
wg.Add(1)
// goroutine
go func()
defer wg.Done()
for i := 0; i < 10000; i++
// unsafe increment
count++
()
wg.Wait()
fmt.Println(count)
加锁,线程安全:
var myLock sync.Mutex
var wg sync.WaitGroup
count := 0
for i := 0; i < 10; i++
// wg add 1 goroutine
wg.Add(1)
// goroutine
go func()
defer wg.Done()
for i := 0; i < 10000; i++
// safe increment
myLock.Lock()
count++
myLock.Unlock()
()
wg.Wait()
fmt.Println(count)
其中一个运行输出:
53546
100000
自定义一个safe Counter
package counter
import (
"log"
"sync"
)
type Counter struct
mu *sync.Mutex
Value int
func NewCounter(value int) *Counter
return &Counter
new(sync.Mutex), 0,
func (c *Counter) Increment()
c.mu.Lock()
// defer func
defer func()
c.mu.Unlock()
log.Printf("mu sync.Mutex Unlocked!")
()
// safe increment Value
c.Value++
使用 safe Counter
var wg sync.WaitGroup
count := counter.NewCounter(0)
for i := 0; i < 10; i++
// wg add 1 goroutine
wg.Add(1)
// goroutine
go func()
defer wg.Done()
for i := 0; i < 10000; i++
// safe increment
count.Increment()
()
wg.Wait()
fmt.Println(count.Value)
正确输出:
100000
以上是关于sync.Mutex 与 sync.WaitGroup 使用示例的主要内容,如果未能解决你的问题,请参考以下文章
不得不知道的golang之sync.Mutex互斥锁源码分析