多线程并发

锁实现方式

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)
}
原文地址:https://www.cnblogs.com/dqh123/p/13225522.html