美文网首页
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

    锁 在读写锁中,读锁虽然不互斥,但是也会消耗大量性能 分析下面的代码,你会看到 RLock 的耗费的时间 通过分析...

  • 并发容器-map

    map区别 ConcurrentHashMapConcurrentHashMap使用(Segment[分片])锁机...

  • 技术好文集合

    缓存热点key 大value问题,解决方案 golang sync.Map 如何理解互斥锁、条件锁、读写锁以及自旋锁?

  • 并发安全的有锁map

    并发安全的有锁map 直接上代码吧:

  • Java Map 按key排序和按Value排序

    title: Java Map 按key排序和按Value排序date: 2016/8/31 15:24:13ta...

  • 1、ConcurrentHashMap

    ConcurrentHashMap 是一个线程安全的map。其他特点和hashMap一致。 相比如1.7的分段式锁...

  • go之channel

    channel channel的实现相对map简单了不少,通过锁mutex来保证并发安全,同时只提供读写和关闭操作...

  • 13. Maps

    13. Maps 什么是 map ? map 是在 Go 中将值(value)与键(key)关联的内置类型。通过相...

  • 深入理解ConcurrentHashmap(JDK1.6到1.7

    concurrentHashmap是JDK提供的一个线程安全的Map容器类,因为它是线程安全的,同时获取和释放锁的...

  • 011_scala编程详解Map与Tuple

    创建Map 访问Map 修改Map 遍历Map SortedMap和LinkedHashMap Map的元素类型-...

网友评论

      本文标题:13 - 锁和Map

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