zoukankan      html  css  js  c++  java
  • 原子操作、互斥锁、读写锁

    原子操作

    package main
    
    import (
        "fmt"
        "sync"
        "sync/atomic" //原子操作,比读写锁和互斥锁都要快,原子操作在用户态,其他锁在内核态
        "time"
    )
    
    var w sync.WaitGroup
    var count int32
    
    func main() {
        w.Add(1)
        start := time.Now().UnixNano()
        go func() {
            for i := 0; i < 1000000; i++ {
                atomic.AddInt32(&count, 1) //原子操作
            }
            w.Done()
        }()
    
        for i := 0; i < 1000000; i++ {
            atomic.AddInt32(&count, 1)
        }
    
        w.Wait()
        end := time.Now().UnixNano()
        fmt.Println((end - start) / 1000 / 1000)
        fmt.Println(count)
    }


    互斥锁

    package main
    
    import (
        "fmt"
        "sync"
        "time"
    )
    
    var lock sync.Mutex  //互斥锁
    var w sync.WaitGroup //等待子线程退出
    var count int
    
    func main() {
        start := time.Now().UnixNano()
        w.Add(1) //相当于标记起一个子线程
        go func() {
            for i := 0; i < 1000000; i++ {
                lock.Lock()
                count++
                lock.Unlock()
            }
            w.Done() //相当于标记关闭一个子线程
        }()
    
        for i := 0; i < 1000000; i++ {
            lock.Lock()
            count++
            lock.Unlock()
        }
    
        w.Wait()
        end := time.Now().UnixNano()
        fmt.Println((end - start) / 1000 / 1000)
        fmt.Println(count)
    
    }


    读写锁

    package main
    
    import (
        "fmt"
        "sync"
        "time"
    )
    
    var rwLock sync.RWMutex //读写锁,读锁所有线程都可以同时用(除了写线程),但是同时写线程不能用写锁。用于读多写少。
    var lock sync.Mutex
    var w sync.WaitGroup
    var count int
    
    func main() {
        w.Add(1)
        start := time.Now().UnixNano()
        go func() {
            for i := 0; i < 1000; i++ {
                //rwLock.Lock()  //写锁
                lock.Lock() //互斥锁
                count++
                time.Sleep(5 * time.Millisecond)
                lock.Unlock()
                //rwLock.Unlock()
            }
            w.Done()
        }()
    
        for i := 0; i < 16; i++ {
            w.Add(1)
            go func() {
                for i := 0; i < 5000; i++ {
                    //rwLock.RLock()  //读锁
                    lock.Lock()
                    time.Sleep(1 * time.Millisecond)
                    lock.Unlock()
                    //rwLock.RUnlock()
                }
                w.Done()
            }()
        }
        w.Wait()
        end := time.Now().UnixNano()
        fmt.Println((end - start) / 1000 / 1000)
        //fmt.Println(count)
    }
  • 相关阅读:
    创建一个简单的图片服务器
    spring-boot系列:初试spring-boot
    java的动态代理机制
    jedis连接池详解(Redis)
    使用logback.xml配置来实现日志文件输出
    redis在mac上的安装
    理解RESTful架构
    分布式应用框架Akka快速入门
    [Java基础]Java通配符
    Mac vim iterm2配色方案
  • 原文地址:https://www.cnblogs.com/domestique/p/8645362.html
Copyright © 2011-2022 走看看