go语言中的锁分两种:1、sync.Mutex互斥锁2、sync.RWMutex读写锁
方法/步骤
2
每次一个goroutine访问bank变量时(这里只有balance余额变量),它都会调用mutex的Lock方 法来获取一个互斥锁。如果其它的goroutine已经获得了这个锁的话,这个操作会被阻塞直到其它goroutine调用了Unlock使该锁变回可用状态。mutex会保护共享变量。惯例来说,被 mutex所保护的变量是在mutex变量声明之后立刻声明的。 在Lock和Unlock之间的代码段中的内容goroutine可以随便读取或者修改,这个代码段叫做临 界区。goroutine在结束后释放锁是必要的,无论以哪条路径通过函数都需要释放,即使是在错误路径中,也要记得释放。
3
Balance函数只需要读取变量的状态,所以我们同时让多个Balance调用并发运行事实上是安全的,只要在运行的时候没有存款或者取款操作就行。在这种场景下我们需要一种特殊 类型的锁,其允许多个只读操作并行执行,但写操作会完全互斥。这种锁叫作“多读单写”锁 (multiple readers, single writer lock),Go语言提供的这样的锁是sync.RWMutex
4
Balance函数现在调用了RLock和RUnlock方法来获取和释放一个读取或者共享锁。Deposit函 数没有变化,会调用mu.Lock和mu.Unlock方法来获取和释放一个写或互斥锁。
下一篇:球形锁怎么开