zoukankan      html  css  js  c++  java
  • 多线程并发

    锁实现方式

    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)
    }
  • 相关阅读:
    android中的style部分属性值介绍
    eclipse 代码提示快捷键 alt+/
    ListView中Spinner的使用+ ListView中常用样式和属性
    通过重载new和delete实现简单的对象池
    C# 3.0下有限状态机的一种优雅的实现
    更改MenuStrips样式
    WinPcap编程3——获取网络适配器列表
    lex and yacc
    WinPcap编程4——捕获数据包
    WinPcap编程2——环境搭建
  • 原文地址:https://www.cnblogs.com/dqh123/p/13225522.html
Copyright © 2011-2022 走看看