sync包
大家好,我是小许,标准库中的sync包在我们的日常开发中用的颇为广泛,那么大家对sync包的用法知道多少呢,这篇文章就大致讲一下sync包和它的使用
Package sync provides basic synchronization primitives such as mutual exclusion locks. Other than the Once and WaitGroup types, most are intended for use by low-level library routines. Higher-level synchronization is better done via channels and communication.
Values containing the types defined in this package should not be copied.
这句话大意就是说:sync包提供了基本的同步基元,如互斥锁。除了Once和WaitGroup类型,大部分都是适用于低水平程序线程,高水平的同步使用channel通信更好一些
包中定义了以下类型: Locker, Once, Mutex, RWMutex, WaitGroup, Pool。接下来我们逐个讲每种类型的使用,所有这些在Go sdk中的src/runtime/sync包,可逐个查看,特别是结合test一起
1.Locker
Locker接口,包含Lock()和Unlock()两个方法,用于代表一个能被加锁和解锁的对象.
![Locker接口 Locker接口](https://cdn.jsdelivr.net/gh/truthxu/cdn/one/locker.png)
1.1 Lock()
Lock方法锁住Mutex,如果Mutex已经加锁,则阻塞直到m解锁
![Lock方法 Lock方法](https://cdn.jsdelivr.net/gh/truthxu/cdn/one/lock_method.png)
1.2 UnLock()
Unlock方法解锁m,如果解锁一个未加锁的mutex会导致运行时错误、锁定m与特定的groutine无关。允许不同的groutine进行加锁、解锁
![UnLock方法 UnLock方法](https://cdn.jsdelivr.net/gh/truthxu/cdn/one/unlock_method.png)
2.Once
Once是只执行一次动作的对象,使用后不得复制
![Once结构 Once结构](https://cdn.jsdelivr.net/gh/truthxu/cdn/one/once.png)
Once只有一个Do方法
var once Once