Go 语言进阶与依赖管理 | 青训营笔记

75 阅读2分钟

这是我参与「第五届青训营 」伴学笔记创作活动的第 6 天 sync包提供基本的同步语句,如互斥锁(mutualexclusion locks)。除了“once”和“WaitGroup”类型之外,大多数类型都是为了低级库的使用。更高级别的同步最好通过channels和communication实现。且不应复制包含此包中定义的类型的值。

1.类型Cond

Cond实现了一个条件变量,即响应或声明函数发生的goroutine的位置。每个Cond都有一个关联的Locker L(通常是Mutex或RWMutex),在更改条件和调用Wait方法时必须保持该L。首次使用后不得复制Cond。在Go内存模型的术语中,Cond安排对Broadcas或Signal的调用在解除阻塞的任何等待调用之前“synchronizes before”。对于许多简单的用例,用户使用channels比使用Cond要好(广播对应于关闭频道,信号对应于在频道上发送)。

2.函数NewCond

NewCond返回一个带有Locker l的新Cond。

3.函数 (*Cond)Broadcast

Broadcast会唤醒所有等待cond的goroutine。允许但不要求请求在通话中保持cond.L。

函数 (*Cond)Signal

sianal唤醒一个等待cond的goroutine(如果有)。允许但不要求请求在通话中保持cond.L。Signal()不影响goroutine调度优先级;如果其他goroutine试图锁定cond.L,他们可能会在“wait”goroutine之前被唤醒。

函数 (*Cond)Wait

wait以原子方式解锁cond.L并挂起调用goroutine的执行。稍后恢复执行后,Wait在返回之前锁定cond.L。与其他系统不同,除非被Broadcast或signal唤醒,否则wait无法返回。

类型Locker

Locker表示可以锁定和解锁的对象。

类型Map

Map类似于Go-Map interface{{},但对于多个goroutine的并发使用来说是安全的,无需额外的锁定或协调。加载、存储和删除在固定的时间内运行。

Map类型是专门化的。大多数代码应该使用一个普通的Go映射,并单独锁定或协调,以获得更好的类型安全性,并使它更容易维护其他不变量以及映射内容。

Map类型针对两种常见的用例进行了优化:(1)当给定项只写入一次但读取多次时,例如在只增长的缓存中,或(2)当多个goroutine读取、写入和覆盖键的disjointset项时。在这两种情况下,与Go映射与单独的Mutex或RWMutex配对相比,使用Map可以显著减少锁争用。

零映射是空的,可以使用了。首次使用后不得复制地图。

在Go内存模型的术语中,Map安排写操作在观察写操作效果的任何读操作之前“同步”,其中读操作和写操作的定义如下。Load、LoadAndDelete、LoadOrStore是读操作;Delete、LoadAndDelete和Store是写操作;当LoadOrStore返回loaded set为false时,它是一个写操作。