Lock 与 waitGroup
package share_memory
import (
"sync"
"testing"
"time"
)
func TestCounter(t *testing.T){
counter := 0
for i:=0; i<5000; i++{
go func() {
counter++
}()
}
time.Sleep( 1 * time.Second)
t.Logf("counter = %d",counter)
}
func TestCounterThreadSafe(t *testing.T){
var mut sync.Mutex
counter := 0
for i:=0; i<5000; i++{
go func() {
defer func() {
mut.Unlock()
}()
mut.Lock()
counter++
}()
}
//time.Sleep( 1 * time.Second)
t.Logf("counter = %d",counter)
}
func TestCounterWaitGroup(t *testing.T){
var wg sync.WaitGroup
var mux sync.Mutex
counter := 0
for i:=0; i<5000; i++{
wg.Add(2)
go func() {
defer func() {
mux.Unlock()
}()
mux.Lock()
counter++
wg.Done()
}()
go func() {
defer func() {
mux.Unlock()
}()
mux.Lock()
counter++
wg.Done()
}()
wg.Wait()
}
//time.Sleep( 1 * time.Second)
t.Logf("counter = %d",counter)
}
本文通过三个并发编程示例,对比分析了使用Lock、WaitGroup和互斥锁实现线程安全计数器的方法。在TestCounter函数中,未使用同步机制导致计数不准确。而在TestCounterThreadSafe中,引入Mutex解决了并发问题。最后,TestCounterWaitGroup利用WaitGroup确保所有goroutine执行完毕后再进行计数,确保结果正确。
401

被折叠的 条评论
为什么被折叠?



