Go-共享内存并发机制

目录

一、并发机制

1、非线程安全

2、线程安全

二、WaitGroup - 同步等待协程执行结果

三、总结


一、并发机制

1、非线程安全

package share_mem

import (
	"fmt"
	"sync"
	"testing"
	"time"
)

//线程不安全计数器
func TestCounter(t *testing.T)  {
	var counter int

	for i := 0; i < 5000; i++ {
		go func() {
			counter++
		}()
	}

	//这里等一秒是因为我们不知道所有的协程执行完毕需要多久,
	//防止主程序已经退出了,协程还没执行完导致结果不准确,后面会介绍更好的处理方案。
	time.Sleep(time.Second * 1)
	fmt.Printf("counter=%d\n", counter)
}

/*
可以看到下面的执行结果,counter 并不等于 5000

=== RUN   TestCounter
counter=4775
--- PASS: TestCounter (1.01s)
PASS
*/

当我们不使用锁的机制来使用协程时,counter 变量在不同的协程里面去做自增,导致了并发时锁的竞争,丢失了很多正确的写操作,即不是一个线程安全的程序。

2、线程安全

那么我们现在就要对这个共享内存做一个线程保护

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值