sync.Map与map不同,不是以语言原生形态提供,而是在 sync 包下的特殊结构:
我们下来看下sync.Map结构体
结构体之间的关系如下图所示:
总结一下:
Load方法比较简单,总结一下:
总结如下:
Once 结构体 和 Go()方法都是位于 sync 包下,主要为了保证 Do(func) 中的 func 只执行一次,用于单例模式是比较好的方案。
原理:
前言:为了保证并发安全,go语言中可以使用原子操作。其执行过程不能被中断,这也就保证了同一时刻一个线程的执行不会被其他线程中断,也保证了多线程下数据操作的一致性。
在atomic包中对几种基础类型提供了原子操作,包括int32,int64,uint32,uint64,uintptr,unsafe.Pointer。
对于每一种类型,提供了五类原子操作分别是
Load和Store操作对应与变量的原子性读写,许多变量的读写无法在一个时钟周期内完成,而此时执行可能会被调度到其他线程,无法保证并发安全。
⚠️Load 只保证读取的不是正在写入的值,Store只保证写入是原子操作。
所以在使用的时候要注意。
下面简单示例:
点击