• 多线程并发


    锁实现方式

    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)
    }
  • 相关阅读:
    C# 遍历Hashtable
    asp.net 处理超链接中文参数编码问题
    electronvue开发问题总结
    vue全局使用样式文件vueclipluginstyleresourcesloader
    win10使用VMware安装macOS11.1镜像系统教程
    LVM从CentOS7默认安装的/home中转移空间到根目录/(转载)
    Nginx引用多配置文件
    ssh_exchange_identification: read: Connection reset by peer
    linux修改时区
    修改键盘Tab键为四个空格
  • 原文地址:https://www.cnblogs.com/dqh123/p/13225522.html
Copyright © 2020-2023  润新知