首页 > 解决方案 > 为什么 sync.Mutex 存在?

问题描述

为什么sync.Mutex在我们有的时候存在sync.RWMutex?我可以锁定/解锁 rw 互斥锁。它们之间的主要区别是什么?

标签: goconcurrency

解决方案


确实,您可以sync.RWMutex在需要时使用 a sync.Mutex

我认为两者都存在,因为在很多情况下 async.Mutex就足够了(您不需要读写级别锁定),并且实现sync.Mutex更简单:需要更少的内存并且很可能更快。

sync.Mutex只有 8 个字节:

type Mutex struct {
    state int32
    sema  uint32
}

Whilesync.RWMutex是 8 + 16 = 24 字节(包括 a sync.Mutex):

type RWMutex struct {
    w           Mutex  // held if there are pending writers
    writerSem   uint32 // semaphore for writers to wait for completing readers
    readerSem   uint32 // semaphore for readers to wait for completing writers
    readerCount int32  // number of pending readers
    readerWait  int32  // number of departing readers
}

是的,您可以说 8 或 24 字节无关紧要。只要您只有几个互斥锁,它就不会。

但是将互斥体放入它应该保护的结构中并不少见(嵌入或常规的命名字段)。现在,如果您拥有这些结构值的一部分,甚至可能有数千个,那么是的,它将产生明显的不同。

此外,如果您只需要一个互斥锁,sync.Mutex那么您滥用它的机会就会减少(您不会意外调用RLock(),因为它没有该方法)。


推荐阅读