Go 标准库 —— sync.Mutex 互斥锁

Mutex 是一个互斥锁,能够建立为其余结构体的字段;零值为解锁状态。Mutex 类型的锁和线程无关,能够由不一样的线程加锁和解锁。

方法

func (*Mutex) Lock

func (m *Mutex) Lock()

Lock 方法锁住 m,若是 m 已经加锁,则阻塞直到 m 解锁。golang

func (*Mutex) Unlock

func (m *Mutex) Unlock()

Unlock 方法解锁 m,若是 m 未加锁会致使运行时错误。post

注意

  • 在一个 goroutine 得到 Mutex 后,其余 goroutine 只能等到这个 goroutine 释放该 Mutex
  • 使用 Lock() 加锁后,不能再继续对其加锁,直到利用 Unlock() 解锁后才能再加锁
  • 在 Lock() 以前使用 Unlock() 会致使 panic 异常
  • 已经锁定的 Mutex 并不与特定的 goroutine 相关联,这样能够利用一个 goroutine 对其加锁,再利用其余 goroutine 对其解锁
  • 在同一个 goroutine 中的 Mutex 解锁以前再次进行加锁,会致使死锁
  • 适用于读写不肯定,而且只有一个读或者写的场景

实例

package main

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

func main() {

    var mutex sync.Mutex
    wait := sync.WaitGroup{}

    fmt.Println("Locked")
    mutex.Lock()

    for i := 1; i <= 3; i++ {
        wait.Add(1)

        go func(i int) {
            fmt.Println("Not lock:", i)

            mutex.Lock()
            fmt.Println("Lock:", i)

            time.Sleep(time.Second)

            fmt.Println("Unlock:", i)
            mutex.Unlock()

            defer wait.Done()
        }(i)
    }

    time.Sleep(time.Second)
    fmt.Println("Unlocked")
    mutex.Unlock()

    wait.Wait()

}

运行结果:.net

Locked
Not lock: 1
Not lock: 2
Not lock: 3
Unlocked
Lock: 1
Unlock: 1
Lock: 2
Unlock: 2
Lock: 3
Unlock: 3

参考

原文地址: https://shockerli.net/post/go...
更多文章请访问个人我的博客: https://shockerli.net
相关文章
相关标签/搜索