图解Go里面的sync.Map了解编程语言核心实现源码
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> 基础筑基 在大多数语言中原始map都不是一个线程安全的数据结构,那如果要在多个线程或者goroutine中对线程进行更改就需要加锁,除了加1个大锁,不同的语言还有不同的优化方式, 像在java和go这种语言其实都采用的是链表法来进行map的实现,本文也主要分析这种场景 并发安全的map实现的三种方式 在go语言中实现多个goroutine并发安全访问修改的map的方式,主要有如下三种: 实现方式 原理 适用场景 map+Mutex 通过Mutex互斥锁来实现多个goroutine对map的串行化访问 读写都需要通过Mutex加锁和释放锁,适用于读写比接近的场景 map+RWMutex 通过RWMutex来实现对map的读写进行读写锁分离加锁,从而实现读的并发性能提高 同Mutex相比适用于读多写少的场景 sync.Map 底层通分离读写map和原子指令来实现读的近似无锁,并通过延迟更新的方式来保证读的无锁化 读多修改少,元素增加删除频率不高的情况,在大多数情况下替代上述两种实现 上面三种实现具体的性能差异可能还要针对不同的具体的业务场景和平台、数据量等因此来进行综合的测试,源码的学习更多的是了解其实现细节,以便在出现性能瓶颈的时候可以进行分析,找出解决解决方案 map的容量问题