【大数据】- Hadoop 基本操作
【Docker】零碎知识整理
【Golang】- sync.map
前言
由于要造一些轮子,例如 像 laravel 一样的 Event组件
,我参考了网上的几个库
这 2 个库,大同小异,只有一小部分差别,新打组件将会在这 2 个库的基础上再封装
这 2 个库都是比较早期的库,所以在实现上用到了 map,但是由于考虑到 map 的线程安全性问题,所以他们都使用了 go1.9 之前实现的方式,就是在结构体嵌入一个读写锁来避免线程安全问题。
在 Go 1.6 之前, 内置的 map 类型是部分 goroutine 安全的,并发的读没有问题,并发的写可能有问题。自 go 1.6 之后, 并发地读写 map 会报错,这在一些知名的开源库中都存在这个问题,所以 go 1.9 之前的解决方案是额外绑定一个锁,封装成一个新的 struct 或者单独使用锁都可以。
本文带你深入到 sync.Map 的具体实现中,看看为了增加一个功能,代码是如何变的复杂的,以及作者在实现 sync.Map 的一些思想。