美文网首页
Golang 互斥锁与读写锁

Golang 互斥锁与读写锁

作者: Rnben | 来源:发表于2019-03-29 20:46 被阅读0次

互斥锁

代码示例

package main

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

func main() {
    //声明
    var mutex sync.Mutex
    fmt.Println("Lock the lock. (G0)")
    //加锁mutex
    mutex.Lock()

    fmt.Println("The lock is locked.(G0)")
    for i := 1; i < 4; i++ {
        go func(i int) {
            fmt.Printf("----Lock the lock. (G%d)\n", i)
            mutex.Lock()
            fmt.Printf("++++The lock is locked. (G%d)\n", i)
        }(i)
    }
    //休息一会,等待打印结果
    time.Sleep(time.Second)
    fmt.Println("Unlock the lock. (G0)")
    //解锁mutex
    mutex.Unlock()

    fmt.Println("The lock is unlocked. (G0)")
    //休息一会,等待打印结果
    time.Sleep(time.Second)
    Lock the lock. (G0)
    // 同一个互斥锁的成对锁定和解锁操作放在同一层次的代码块中。
}

打印结果

Lock the lock. (G0)
The lock is locked.(G0)
----Lock the lock. (G2)
----Lock the lock. (G1)
----Lock the lock. (G3)
Unlock the lock. (G0)
The lock is unlocked. (G0)
++++The lock is locked. (G2) //随机 G1 G2 G3

使用互斥锁的注意事项如下:

  1. 不要重复锁定互斥锁;
    对一个已经被锁定的互斥锁进行锁定,是会立即阻塞当前的 goroutine 的。这个 goroutine 所执行的流程,会一直停滞在调用该互斥锁的Lock方法的那行代码上。
  2. 不要忘记解锁互斥锁,必要时使用defer语句;
    应该保证,对于每一个锁定操作,都要有且只有一个对应的解锁操作,避免重复锁定
  3. 不要对尚未锁定或者已解锁的互斥锁解锁;
    解锁未锁定的互斥锁会立即引发 panic,这种由 Go 语言运行时系统自行抛出的 panic 都属于致命错误,都是无法被恢复的。
  4. 不要在多个函数之间直接传递互斥锁。
    sync.Mutex是一个结构体类型,属于值类型中的一种。把它传给一个函数、将它从函数中返回、把它赋给其他变量、让它进入某个通道都会导致它的副本的产生。原值和它的副本,以及多个副本之间都是完全独立的,它们都是不同的互斥锁。

建议:尽量避免把一个互斥锁同时用在了多个地方,多个goroutine 争用这把锁增大死锁可能性。而最简单、有效的方式就是让每一个互斥锁都只保护一个临界区或一组相关临界区。

读写锁

读写锁sync.RWMutex是把对共享资源的“读操作”和“写操作”区别对待了。它可以对这两种操作施加不同程度的保护。换句话说,相比于互斥锁,读写锁可以实现更加细腻的访问控制。
对于某个受到读写锁保护的共享资源,多个写操作不能同时进行,写操作和读操作也不能同时进行,但多个读操作却可以同时进行。

相关文章

  • Golang 锁的相关知识

    Golang锁分类:互斥锁(Mutex)、读写锁(RWMutex)。 互斥锁 在编写代码中引入了对象互斥锁的概念,...

  • go-锁机制

    Golang中的锁机制主要包含互斥锁和读写锁 互斥锁 互斥锁是一种简单的加锁的方法来控制对共享资源的访问,互斥锁只...

  • golang 中 sync.Mutex 和 sync.RWMut

    介绍 golang 中的 sync 包实现了两种锁: Mutex:互斥锁 RWMutex:读写锁,RWMutex ...

  • golang笔记之基于共享变量的并发

    介绍 golang 中的 sync 包实现了两种锁: Mutex:互斥锁 RWMutex:读写锁,RWMutex ...

  • Golang 互斥锁与读写锁

    互斥锁 代码示例 打印结果 Lock the lock. (G0)The lock is locked.(G0)-...

  • 技术好文集合

    缓存热点key 大value问题,解决方案 golang sync.Map 如何理解互斥锁、条件锁、读写锁以及自旋锁?

  • 可重入读写锁 ReentrantReadWriteLock

    读写锁分为读锁和写锁,多个线程获取读锁不互斥,读写锁、写写锁互斥。 输出

  • 读写锁和互斥锁 读写互斥锁,简称读写锁 mux sync.RWMutex Lock和Unlock分别对写锁进行锁定...

  • Go 语言的锁

    Go 语言提供两类锁: 互斥锁(Mutex)和读写锁(RWMutex)。其中读写锁(RWMutex)是基于互斥锁(...

  • Golang 读写锁RWMutex 互斥锁Mutex 源码详解

    前言 Golang中有两种类型的锁,Mutex (互斥锁)和RWMutex(读写锁)对于这两种锁的使用这里就不多说...

网友评论

      本文标题:Golang 互斥锁与读写锁

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