Go从入门到实战——共享内存并发机制(笔记)

共享内存并发机制

Lock

在这里插入图片描述

错误示范

package share_test

import (
	"testing"
	"time"
)

func TestCounter(t *testing.T) {
	coun := 0
	for i := 0; i < 5000; i++ {
		go func() {
			coun++
		}()
	}
	time.Sleep(time.Second)
	t.Log(coun)
}

在这里插入图片描述
在不同的协程中进行自增,增加了相互竞争。不是一个线程安全的程序

正确写法

func TestCounterThreadSafe(t *testing.T) {
	var mut sync.Mutex
	coun := 0
	for i := 0; i < 5000; i++ {
		go func() {
			defer func() {
				mut.Unlock()
			}()
			mut.Lock()
			coun++
		}()
	}
	time.Sleep(time.Second)
	t.Log(coun)
}

在这里插入图片描述

WaitGroup

func TestCounterWaitGroup(t *testing.T) {
	var wg sync.WaitGroup
	var mut sync.Mutex
	coun := 0
	for i := 0; i < 5000; i++ {
		wg.Add(1)
		go func() {
			mut.Lock()
			defer func() {
				mut.Unlock()
			}()
			coun++
			wg.Done()
		}()
	}
	wg.Wait()
	t.Log(coun)
}

在这里插入图片描述
精确控制等待时间

猜你喜欢

转载自blog.csdn.net/weixin_42094659/article/details/107732651