Go sync包

42 阅读3分钟

文章首发于个人博客

Mutex

  • 无需显式初始化,直接声明变量即可使用。

  • 互斥锁,同一时刻只能有一个协程持有锁,不分读写。

方法含义说明
Lock加锁
Unlock解锁未加锁时调用会导致panic
TryLock尝试加锁立即返回,成功返回true,失败返回false

RWMutex

  • 无需显式初始化,直接声明变量即可使用。

  • 读写锁,同一时刻可以有多个协程持有读锁,但是只能有一个协程持有写锁。

  • 有写锁时,其他协程无法获取读锁和写锁。

  • 有读锁时,其他协程可以获取读锁,但是无法获取写锁。

方法含义说明
RLock加读锁
RUnlock解读锁未加读锁时调用会导致panic
TryRLock尝试加读锁立即返回,成功返回true,失败返回false
Lock加写锁
Unlock解写锁未加写锁时调用会导致panic
TryLock尝试加写锁立即返回,成功返回true,失败返回false

Map

  • 无需显式初始化,直接声明变量即可使用。
方法含义说明
Store存储键值对
Load加载键对应的值
Delete删除键对应的值
Clear清除所有键值对
Swap交换指定键对应的旧值和新值,并返回旧值和操作之前键是否存在
LoadAndDelete加载键对应的值并删除键值对
LoadOrStore加载键对应的值,如果键不存在则存储键值对
CompareAndDelete比较键对应的值是否等于指定值,如果相等则删除键值对
CompareAndSwap比较键对应的值是否等于指定值,如果相等则替换键对应的值
Range遍历键值对传入函数返回false时停止遍历

WaitGroup

  • 无需显式初始化,直接声明变量即可使用。
方法含义说明
Add添加计数器启动协程前调用,传入协程数量
Done减少计数器协程执行完毕后调用
Wait等待计数器变为0主协程调用,等待所有协程执行完毕

Once

  • 无需显式初始化,直接声明变量即可使用。
方法含义说明
Do执行函数传入函数,只会执行一次

Pool

  • 需显式初始化,为New指定创建对象的函数。

  • 主要目的是缓存已分配但未使用的对象以便后续重用。

  • 池中的对象为临时对象可能随时消失,不能依赖其中对象一直存在。

  • 首次使用后不能被复制。

方法含义说明
Get从池中获取对象无可用对象时会调用New(不为nil)创建一个新对象
Put把对象放回池中

Cond

  • 需显式初始化,指定一个锁。

  • 用于协调协程的执行顺序,常用于生产者/消费者模型。

方法含义说明
Broadcast广播唤醒所有等待的协程
Signal唤醒一个等待的协程
Wait将协程持有的锁释放,同时将协程加入等待队列并阻塞协程,等待唤醒调用时必需在循环中检查条件

包函数

方法含义说明
NewCond创建一个新的条件变量需指定一个
OnceFunc创建一个只执行一次的无返回值的函数调用返回函数时,传入函数只会执行一次
OnceValue创建一个只执行一次的只有一个返回值的函数调用返回函数时,传入函数只会执行一次
OnceValues创建一个只执行一次的有两个返回值的函数调用返回函数时,传入函数只会执行一次