多线程并发

锁实现方式

package main

import (
    "fmt"
    "time" "sync" "sync/atomic" ) func main() { var balance int32 = 0 count := 100000000 t1 := time.Now() transLock := sync.Mutex{} wg := sync.WaitGroup{} for i:=0;i<count;i++ { wg.Add(1) go transferLock(&balance,&transLock,&wg)//3.1518197s|32.0352204s } wg.Wait() elapsed := time.Since(t1) fmt.Println(" 耗时: ", elapsed) fmt.Println("balance:",balance) } func transferLock(balance *int32, lock *sync.Mutex,wg *sync.WaitGroup) { defer wg.Done() lock.Lock() *balance = *balance +1 lock.Unlock() }

CAS实现方式 : 先读取数据,再计算,再更新

package main

import (
    "fmt"
    "time" "sync" "sync/atomic" ) func main() { var balance int32 = 0 count := 100000000 t1 := time.Now() wg := sync.WaitGroup{} for i:=0;i<count;i++ { wg.Add(1) go transferCAS(&balance,&wg)//3.126052s|31.8275625s } wg.Wait() elapsed := time.Since(t1) fmt.Println(" 耗时: ", elapsed) fmt.Println("balance:",balance) } func transferCAS(balance *int32,wg *sync.WaitGroup) { defer wg.Done() for { //atomic原子操作 oldbalance := atomic.LoadInt32(balance) newbalance := oldbalance + 1 if atomic.CompareAndSwapInt32(balance, oldbalance, newbalance) { break } } }

FAA实现方式:直接更新

package main

import (
    "fmt"
    "time" "sync" "sync/atomic" ) func main() { var balance int32 = 0 count := 100000000 t1 := time.Now() wg := sync.WaitGroup{} for i:=0;i<count;i++ { wg.Add(1) go transferFAA(&balance,&wg)//3.1998921s|31.6946224s } wg.Wait() elapsed := time.Since(t1) fmt.Println(" 耗时: ", elapsed) fmt.Println("balance:",balance) } func transferFAA(balance *int32,wg *sync.WaitGroup) { defer wg.Done() atomic.AddInt32(balance,1) }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值