美文网首页
13 - 锁和Map

13 - 锁和Map

作者: 天命_风流 | 来源:发表于2020-07-15 10:08 被阅读0次

    • 在读写锁中,读锁虽然不互斥,但是也会消耗大量性能
    • 分析下面的代码,你会看到 RLock 的耗费的时间
    package lock_test
    
    import (
        "fmt"
        "sync"
        "testing"
    )
    
    var cache map[string]string
    
    const NUM_OF_READER int = 40
    const READ_TIMES = 100000
    
    func init() {
        cache = make(map[string]string)
    
        cache["a"] = "aa"
        cache["b"] = "bb"
    }
    
    func lockFreeAccess() {
    
        var wg sync.WaitGroup
        wg.Add(NUM_OF_READER)
        for i := 0; i < NUM_OF_READER; i++ {
            go func() {
                for j := 0; j < READ_TIMES; j++ {
                    _, err := cache["a"]
                    if !err {
                        fmt.Println("Nothing")
                    }
                }
                wg.Done()
            }()
        }
        wg.Wait()
    }
    
    func lockAccess() {
    
        var wg sync.WaitGroup
        wg.Add(NUM_OF_READER)
        m := new(sync.RWMutex)
        for i := 0; i < NUM_OF_READER; i++ {
            go func() {
                for j := 0; j < READ_TIMES; j++ {
    
                    m.RLock()
                    _, err := cache["a"]
                    if !err {
                        fmt.Println("Nothing")
                    }
                    m.RUnlock()
                }
                wg.Done()
            }()
        }
        wg.Wait()
    }
    
    func BenchmarkLockFree(b *testing.B) {
        b.ResetTimer()
        for i := 0; i < b.N; i++ {
            lockFreeAccess()
        }
    }
    
    func BenchmarkLock(b *testing.B) {
        b.ResetTimer()
        for i := 0; i < b.N; i++ {
            lockAccess()
        }
    }
    
    • 通过分析,可以看到,RLock 和 RUnlock 都消耗了大量的 CPU


      image.png

    一些可供选择的 Map

    • go 默认的 map 是协程不安全的
    • 使用 sync.Map 可以让他变得安全,同时会有较好的性能


      image.png
    • 你也可以使用一些扩展库


      image.png

    相关文章

      网友评论

          本文标题:13 - 锁和Map

          本文链接:https://www.haomeiwen.com/subject/jvzrhktx.html