面试题答案
一键面试1. 互斥锁(sync.Mutex)
- 高读低写场景:
- 性能特点:性能较低。因为互斥锁同一时间只允许一个goroutine访问临界区,即使读操作之间不冲突,也会依次排队等待锁的释放,导致读操作的并发性能无法充分发挥。
- 原因:互斥锁的设计是为了保证同一时刻只有一个goroutine能进入临界区,以确保数据的一致性,这种机制不区分读操作和写操作,都视为独占式访问。
- 高写低读场景:
- 性能特点:符合设计预期,能够较好地保证数据一致性。虽然写操作之间也需要排队,但这种场景下写操作本身就少,整体性能不会因为锁竞争过于严重而大幅下降。
- 原因:互斥锁保证了每次只有一个写操作能进入临界区,防止写操作之间的冲突以及写操作和读操作之间的冲突,从而确保数据的一致性。
2. 读写锁(sync.RWMutex)
- 高读低写场景:
- 性能特点:性能较好。多个读操作可以同时获取读锁进入临界区,因为读操作本身不会修改数据,不会产生数据冲突,从而大大提高了读操作的并发性能。
- 原因:读写锁区分了读操作和写操作,读锁允许多个goroutine同时持有,只要没有写操作在进行或者等待写锁,读操作就可以并发执行。
- 高写低读场景:
- 性能特点:性能较低。写操作需要获取写锁,而写锁是独占的,一旦有写操作请求,所有的读操作和其他写操作都需要等待,这会导致大量的锁竞争,尤其是在写操作频繁的情况下,会严重影响整体性能。
- 原因:为了保证数据一致性,当有写操作进行时,不允许读操作和其他写操作同时进行,所以在高写低读场景下,写锁的独占性会导致锁竞争加剧,进而影响性能。