go 并发满足方案

package main

import (
	"fmt"
	"sync"
	"sync/atomic"
)

var num = 0
var max = 10000

var wg sync.WaitGroup
/*1、互斥锁满足并发需求:锁的速度非常快,理论上是高速缓存,
*内存总线读写但也应控制锁的范围,不能因为锁的内部过多消耗时间,
*而让其他协程挂起等待,从而降低了并发的效率*/
var mx sync.Mutex
//2、管道满足并发需求
var chf = make(chan string, 1)
//3、使用CAS(Compare-and-Swap) atomic原子递增 【仅适用于int32\64一个变量特定场景】满足并发需求
var nub int32 = 0
//4、等待组[穿行任务伪并发]
var wt sync.WaitGroup

var res1, res2, res3, res4 = num, num, nub, num

func main() {
	wg.Add(2)
	//线程不安全
	for i := 0; i < 2; i++ {
		go add0()
	}
	wg.Wait()
	fmt.Printf("num=%d\n", num)
	//线程安全 方案一
	wg.Add(2)
	for i := 0; i < 2; i++ {
		go add1()
	}
	wg.Wait()
	fmt.Printf("res1=%d\n", res1)
	//线程安全 方案二
	wg.Add(2)
	for i := 0; i < 2; i++ {
		go add2()
	}
	wg.Wait()
	close(chf)
	fmt.Printf("res2=%d\n", res2)
	//线程安全 方案三
	wg.Add(2)
	for i := 0; i < 2; i++ {
		go add3()
	}
	wg.Wait()
	fmt.Printf("res3=%d\n", res3)
	//线程安全 方案四
	wg.Add(2)
	for i := 0; i < 2; i++ {
		wt.Add(1)
		go add4()
		wt.Wait()
	}
	wg.Wait()
	fmt.Printf("res4=%d\n", res4)

}

func add0() {
	for i := 0; i < max; i++ {
		num++
	}
	wg.Done()
}

func add1() {
	for i := 0; i < max; i++ {
		mx.Lock()
		res1++
		mx.Unlock()
	}
	wg.Done()
}

func add2() {
	for i := 0; i < max; i++ {
		chf <- "wt"
		res2++
		<-chf
	}
	wg.Done()
}

func add3() {
	for i := 0; i < max; i++ {
		atomic.AddInt32(&res3, 1)
	}
	wg.Done()
}

func add4() {
	for i := 0; i < max; i++ {
		res4++
	}
	wt.Done()
	wg.Done()
}

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值