本节重点:
- 学会 Mutex 的基本使用
在学习互斥锁之前,应该先了解并发编程中临界区的概念。当一个程序并发运行时,修改共享资源的部分代码不应该被多个Goroutines同时访问。修改共享资源的这段代码称为临界区。
使用互斥锁,限定临界区只能同时由一个线程持有,若是临界区此时被一个线程持有,那么其他线程想进入到这个临界区的时候,就会失败或者等待释放锁,持有此临界区的线程退出,其他线程才有机会获得这个临界区。
互斥锁
Mutex 用于提供一种锁定机制,以确保在任何时间点只有一个 Goroutine 正在运行代码的关键部分,以防止发生竞态条件。
互斥锁在同步包中可用。Mutex上定义了两种方法,即Lock和Unlock。在调用之间存在的任何代码都Lock将Unlock仅由一个 Goroutine 执行,从而避免了竞争条件。
mutex.Lock()
x = x + 1
mutex.Unlock()
x = x + 1
如果一个 Goroutine 已经持有锁,并且如果一个新的 Goroutine 正在尝试获取锁,则新的 Goroutine 将被阻塞,直到互斥锁被解锁。