普通锁:sync.Mutex
就是普通的上锁,锁了之后就要等它完成,其它的goroutine都不能工作要等待它释放拿到锁才能进入临界区,这个也叫全局锁。
读写互斥锁:sync.RWMutex
用.RLock() 来加读锁,其它的goroutine可以继续拿读锁,就是说都可以去读,但是想要写,获取写锁就要等
用.Lock() 加写锁,加了写锁后,其它的goroutine读写都要等待它释放
其次
sync.Once 用来只锁一次就解锁,就是说完成这个任务的时候是锁着的,当他完成后就解锁了,而且只锁一次,一旦这个任务完成解锁后,后续再次调用,不会再上锁。
sync.Map : 因为map数据类型本身就是并发不安全的,修改里面的数据是不安全的,程序限制了对一个map最多20个goroutine操作,不然报错。但这样也不安全,有个专门的方法加锁,只要:
var m = sync.Map()
m.Store(key,value) 去代替 m[key] = value 就可以了
它还内置了Store,Load,LoadOrStore,Delete , Range 等方法-
原子锁:一种锁的基层原子操作,锁就是它实现的。由sync/atomic实现
可以将x=x+1 上锁的过程替换成:atomic.AddInt64(&x, 1)实现。对x的操作就是天然上锁的,不会被别的线程所操作。