sync.map与手动维护的并发安全map

Posted by onceme on Tuesday, January 1, 2019

TOC

sync.map与手动维护的并发安全map

? 原子操作能否并发 * sync.map 使用 read map与dity map * read map 将整个map存入atom.value中,同时value是额外封装了一层数据结构,它先把value值转换为了unsafe.Pointer类型的值,然后再把后者封装,并储存在其中的原生字典中,因此可以用原子操作,并发的修改read map中的不同key * 不过read map新增键值对是需要加互斥锁的,所以不能并发插入 * dity map就是一个元素的map

  • 使用指针来实现并发的读取以及不同key的并发修改

    • //创建一个map值对象类型
      type ValueObj struct {
      Val interface{}
      }
      //定义扩展后的哈希表
      MapDemo map[string]*ValueObj
      
      //初始化已知key,并创建空值
      for _,key := range keys{
       MapDemo[key] = &ValueObj{}
      }
      //之后就可通过 MapDemo[key].Val = "a" 等语句对哈希表的val所指向的变量进行修改
      
      
      • 使用这种方式实现扩展之后的哈希表
      • 只有在创建新key的时候才需要串行执行
      • 读与读的并发请求没有任何限制
      • 读与写的并发,达到了类似mysql行锁的效果,对一个key的修改,只会锁住这个key本身,并不会影响其他key的读写操作
      • 在key的生存时间较长的应用场景下都可以显著提高map的并发性能,使其不再是一个瓶颈

comments powered by Disqus
Ï