使用RWMutex代替Mutex有什么好处?

时间:2018-02-19 07:04:20

标签: go

我不确定何时使用RWMutex以及何时使用Mutex。

如果你使用RWMutex代替Mutex,如果你做更多的读取然后写入,你会节省资源吗?

我看到有些人不管他们做什么都会一直使用Mutex,有些人使用RWMutex并运行这些方法:

func (rw *RWMutex) Lock()
func (rw *RWMutex) Unlock()
func (rw *RWMutex) RLock()
func (rw *RWMutex) RUnlock()

而不只是:

func (m *Mutex) Lock()
func (m *Mutex) Unlock()

如果您节省了资源,那么如果您执行更多读取然后写入,那么您应该使用RWMutex是否有很大差异?

2 个答案:

答案 0 :(得分:12)

来自the docs(强调我的):

  

RWMutex是一个读/写互斥锁。 锁定可由任意数量的读取器或单个写入器保存。 RWMutex的零值是未锁定的互斥锁。

换句话说,读者不必彼此等待。他们只需等待持有锁的作家。

因此,sync.RWMutex最适用于大多数读取的数据,与sync.Mutex相比,保存的资源是时间。

答案 1 :(得分:0)

尝试该程序:

package main

import (
    "fmt"
    "sync"
    "time"
)

func main() {
    var mu sync.RWMutex

    go func() {
        mu.RLock()
        fmt.Println("1", time.Now())
        time.Sleep(time.Second * 3)
        mu.RUnlock()
    }()

    go func() {
        mu.RLock()
        fmt.Println("2", time.Now())
        mu.RUnlock()
    }()

    time.Sleep(time.Second * 4)
}