# go语言Mutex与RWMutex

Posted wining

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了# go语言Mutex与RWMutex相关的知识,希望对你有一定的参考价值。

Mutex(互斥锁)

  • Lock()加锁,Unlock()解锁
  • 适用于读写不确定,并且只有一个读或者写的场景

    例:

package main

import (
    "sync"
    "time"
)

var (
    l *sync.Mutex
    i int
)

func increment() {
    l.Lock()
    defer l.Unlock()
    i++
}

func main() {
    l = new(sync.Mutex)
    for i := 0; i < 1000; i++ {
        go increment()
    }
    println("i=", i)
    time.Sleep(time.Second)
}

RWMutex(读写锁)

  • 基于Mutex 实现,Lock()加写锁,Unlock()解写锁,RLock()加读锁,RUnlock()解读锁
  • 多个goroutine可以同时读,读锁只会阻止写;只能一个同时写,写锁会同时阻止读写
  • 适用于读多写少的场景

    例:

package main

import (
    "sync"
    "time"
)

var (
    l *sync.RWMutex
    i int
)

func write() {
    println("write start")
    l.Lock()
    i++
    l.Unlock()
    println("write end")
}

func read() {
    println("read start")
    l.RLock()
    time.Sleep(time.Millisecond * 100)
    println("read end, i =", i)
    l.RUnlock()
}

func main() {
    l = new(sync.RWMutex)
    go read()
    go read()
    go write()
    time.Sleep(time.Second)
}

以上代码中,会同时启动两个读和一个写,上述代码i的值可能会出现三种情况:

  1. (读读)写
    写锁执行在两个读锁后执行,i输出为:0, 0
  2. 读写读
    写锁在两个读锁中间执行,i输出为:0,1
  3. 写(读读)
    写锁在两个读锁之前执行,i输出为:1,1








以上是关于# go语言Mutex与RWMutex的主要内容,如果未能解决你的问题,请参考以下文章

golang/go语言sync同步包中的WaitGroup等待组Mutex互斥锁和RWMutex读写锁

golang/go语言sync同步包中的WaitGroup等待组Mutex互斥锁和RWMutex读写锁

golang/go语言sync同步包中的WaitGroup等待组Mutex互斥锁和RWMutex读写锁

Go语言互斥锁

Go语言之Go语言锁机制

go中的sync.Mutex 和 sync.RWMutex