GoroutineMutRWMutex

一、互斥锁Mutex

1、Mutex介绍

sync MutexRWMutex
goroutine goroutine

使用互斥锁 (Mutex)时要注意以下几点:

deadlocksync.Mutex
defer

2、Mutex使用实例

下面的代码模拟取钱和存钱操作:

goroutine goroutine goroutinegoroutine goroutinegoroutine

代码使用协程实现多次(5次)对一个账户进行存钱和取钱的操作,先来看不加锁的情况:

Race Condition

下面来看加锁的执行结果:

加锁后就正常了。

下面介绍更细化的互斥锁:读/写互斥锁RWMutex。

二、读写锁RWMutex

1、RWMutex介绍

RWMutexsync.RWMutexUnlockRLockRUnlock

有了互斥锁Mutex,为什么还需要读写锁呢?因为在很多并发操作中,并发读取占比很大,写操作相对较少,读写锁可以并发读取,这样可以提供服务性能。读写锁具有以下特征:

 

读写锁 读锁 写锁
读锁 Yes No
写锁 No No

 

也就是说,

goroutine

在使用读写锁时,还需要注意:

  • 不要对未锁定的读写锁解锁;
  • 对读锁不能使用写锁解锁
  • 对写锁不能使用读锁解锁

2、RWMutex使用实例

改写前面的取钱和存钱操作,添加查询余额的方法:

执行结果:

读写锁和互斥锁的不同之处在于读写锁把对共享资源的读操作和写操作分开了,可以实现更复杂的访问控制。

总结:

读写锁也是一种互斥锁,它是互斥锁的扩展。在使用时需要注意:

  • 加锁后一定要解锁
  • 不要重复加锁或者解锁
  • 不解锁未锁定的锁
  • 不要传递互斥锁

原文链接:https://www.tuicool.com/articles/YFnIJz7