Это правда, что вы можете использовать sync.RWMutex
всякий раз, когда вам нужно sync.Mutex
.
Я думаю, что оба существуют, потому что есть много случаевкогда достаточно sync.Mutex
(вам не нужна блокировка на уровне чтения и записи), а реализация sync.Mutex
проще: требует гораздо меньше памяти и, скорее всего, быстрее.
sync.Mutex
всего 8 байтов:
type Mutex struct {
state int32
sema uint32
}
В то время как sync.RWMutex
равен 8 + 16 = 24 байта (включая 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()
, потому что у него нет этого метода).