美文网首页我爱编程
Go 标准库 —— sync.Mutex 互斥锁

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

作者: 舆图易稿 | 来源:发表于2018-06-05 11:13 被阅读20次

Mutex 是一个互斥锁,可以创建为其他结构体的字段;零值为解锁状态。Mutex 类型的锁和线程无关,可以由不同的线程加锁和解锁。

方法

func (*Mutex) Lock

func (m *Mutex) Lock()

Lock 方法锁住 m,如果 m 已经加锁,则阻塞直到 m 解锁。

func (*Mutex) Unlock

func (m *Mutex) Unlock()

Unlock 方法解锁 m,如果 m 未加锁会导致运行时错误。

注意

  • 在一个 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()

}

运行结果:

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/golang-pkg-mutex/

相关文章

  • Go超时锁的设计和实现

    Go提供两种锁:sync.Mutex和sync.RWMutex。 sync.Mutex: 互斥锁。任意时刻,只能有...

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

    Mutex 是一个互斥锁,可以创建为其他结构体的字段;零值为解锁状态。Mutex 类型的锁和线程无关,可以由不同的...

  • go 锁的使用

    锁 互斥锁 由标准库代码包sync中的Mutex结构体类型代表,sync.Mutex类型(确切地说,是*sync...

  • Go 并发之互斥锁

    在 Go 语言中使用sync.Mutex 来实现互斥锁,示例代码如下: 输出结果为:

  • Golang学习笔记之互斥锁(Mutex)

    Go语言包中的sync包提供了两种锁,互斥锁(sync.Mutex)和读写锁(sync.RWMutex) 这一篇博...

  • go-day5

    sync包 sync.Mutex 互斥锁 适用于并发访问公共资源的场景。 声明互斥锁 使用互斥锁 sync.RWM...

  • Golang同步相关知识总结

    锁 1.互斥锁表示:sync.Mutex,类型sync.Mutex的零值表示了未被锁定的互斥量作用:保证在同一时刻...

  • go 中的 sync.Mutex 与 sync.RWMutex

    sync.Mutex 互斥锁,不支持递归锁 sync.RWMutex 什么时候用sync.Mutex,什么时候用 ...

  • GO互斥锁sync.Mutex(2)

    Mutext两种模式 正常模式和饥饿模式。一开始默认处于正常模式。在正常模式中,每个新加入竞争锁行列的协程都会直接...

  • GO 互斥锁sync.Mutex (1)

    在去学习go语言锁机制的时候,我会问自己几个问题: 1.锁是什么 ,为什么要用锁?2.都有哪些锁怎么用?3.出现问...

网友评论

    本文标题:Go 标准库 —— sync.Mutex 互斥锁

    本文链接:https://www.haomeiwen.com/subject/lgdpsftx.html