golang基础-互斥锁、读写锁

GO 互斥锁实现原理剖析 为什么80%的码农都做不了架构师?>>> ... 阅读详情
互斥锁

其中Mutex为互斥锁,Lock()加锁,Unlock()解锁,使用Lock()加锁后,便不能再次对其进行加锁,直到利用Unlock()解锁对其解锁后,才能再次加锁.适用于读写不确定场景,即读写次数没有明显的区别,并且只允许只有一个读或者写的场景,所以该锁叶叫做全局锁。 
func (m *Mutex) Unlock()用于解锁m,如果在使用Unlock()前未加锁,就会引起一个运行错误.已经锁定的Mutex并不与特定的goroutine相关联,这样可以利用一个goroutine对其加锁,再利用其他goroutine对其解锁。

package main

import(
    "fmt"
    "time"
    "sync"
    "math/rand"
)

var lock sync.Mutex

func main() {

    testMap()
}
func testMap() {
    var a map[int]int
    a = make(map[int]int, 5)

    a[8] = 10
    a[3] = 10
    a[2] = 10
    a[1] = 10
    a[18] = 10

    for i := 0; i < 2; i++ {
        go func(b map[int]int) {
            lock.Lock()
            b[8] = rand.Intn(100)
            lock.Unlock()
        }(a)
    }

    lock.Lock()
    fmt.Println(a)
    lock.Unlock()

    time.Sleep(time.Second)
    fmt.Println(a)
}

  • 19
  • 20
  • 21
  • 22
  • 2

输出如下:

PS E:\golang\go_pro\src\safly> go run demo.go
map[3:10 2:10 1:10 18:10 8:10]
map[2:10 1:10 18:10 8:87 3:10]
PS E:\golang\go_pro\src\safly>

我们利用了time.Sleep(time.Second)这个进行的延迟,goroute执行完毕,就进行输出,结果是进行了map的修改

读写锁

读写锁实际是一种特殊的自旋锁,它把对共享资源的访问者划分成读者和写者,读者只对共享资源进行读访问,写者则需要对共享资源进行写操作。这种锁相对于自旋锁而言,能提高并发性,因为在多处理器系统中,它允许同时有多个读者来访问共享资源,最大可能的读者数为实际的逻辑CPU数。写者是排他性的,一个读写锁同时只能有一个写者或多个读者(与CPU数相关),但不能同时既有读者又有写者。

1、可以随便读,多个goroutine同时读

package main

import(
    // "fmt"
    "time"
    "sync"

)

var m *sync.RWMutex

func main() {
    m = new(sync.RWMutex)

    // 多个同时读
    go read(1)
    go read(2)

    time.Sleep(2*time.Second)
}

func read(i int) {
    println(i,"read start")

    m.RLock()
    println(i,"reading")
    time.Sleep(1*time.Second)
    m.RUnlock()    

    println(i,"read over")
}

输出如下:

PS E:\golang\go_pro\src\safly> go run demo.go
1 read start
1 reading
1 read over
2 read start
2 reading
2 read over

可以看出1 读还没有结束,2已经在读

GO语言基础进阶教程:sync包——读写锁 官网文档对sync包的介绍: Package sync provides basic synchronization primitives such as mutual exclusion locks. Other than the Once and WaitGroup types, most are intended for use by low-level library routines. Higher-level synchronization is better done via channe 阅读详情

相关推荐

Golang 新手入门教程(十八):Mutex(互斥锁)

在学习互斥锁之前,应该先了解并发编程中临界区的概念。当一个程序并发运行时,修改共享资源的部分代码不应该被多个Goroutines同时访问。修改共享资源的这段代码称为临界区。,若是临界区此时被一个线程持有,那么其他线程想进入到这个临界区的时候,就会失败或者等待释放锁,持有此临界区的线程退出,其他线程才有机会获得这个临界区。!......

麻凡 1034

Go并发编程-读写锁

一、前言go语言类似Java JUC包也提供了一些列用于多线程之间进行同步的措施,比如低级的同步措施有 锁、CAS、原子变量操作类。本节我们先来看看go中读写锁,读写锁相比互斥锁来说并发...

技术原始积累 3495

岭回归的MATLAB步骤

MATLAB 实现框架,它涵盖了从数据导入到岭回归的步骤,包括计算共线性、使用 MAE、MSE、R²、MAPE 进行评价,以及绘制相应的可视化图表。

subject625Ruben的博客 1090

go中的读写锁

场景描述:在并发编程中,经常会遇到对共享资源的读写操作。当读操作远多于写操作时,使用互斥锁(Mutex)可能导致读操作效率低下,因为它不允许多个读操作同时进行。性能问题:使用Mutex时,即使没有写操作,多个读操作也会被串行化,导致性能瓶颈。读写锁(RWMutex):是一种同步原语,用于控制对共享资源的并发访问,允许多个读操作同时进行,但写操作是排他的。选择依据:根据应用场景的读写操作比例来选择合适的锁。如果读操作远多于写操作,RWMutex可能是更好的选择。

z3551906947的博客 1645

Circos在Windows下的安装教程

这里写自定义目录标题Circos简介安装Perl 的安装Circos安装安装及解压安装Modules测试用例官方文档 Circos简介 (来源官网:http://circos.ca/software/readme/ O.INTRODUCTION部分) Circos is a program for the generation of publication-quality, circularly composited renditions of genomic data and related annot

qq_42318911的博客 1661

从零到一:构建嵌入式Nginx的模块化架构与跨平台部署实战

本文详细介绍了在ARM32架构的RV1126嵌入式设备上,通过交叉编译技术构建模块化Nginx服务器的完整实战流程。涵盖环境配置、依赖库编译、Nginx核心与http_ssl_module等模块集成、性能优化及部署调试,为嵌入式开发提供高效可靠的Web服务器解决方案。

rock5的博客 202

27、golang基础-互斥锁、读写锁

golang基础-锁1、Golang的锁2、sync.WaitGroup注意事项1.计数器不能设置为负值2.WaitGroup对象不是一个引用类型3、sync.Mutex4、sync.RWMutex 1、Golang的锁 Golang中的锁有两种:sync.Mutex和sync.RWMutex sync.Mutex的锁只有一种锁:Lock(),它是绝对锁,同一时间只能有一个锁 sync.RWMutex叫读写锁,它有两种锁:Rlock()和Lock() RLock()叫读锁。它不是绝对锁,可以有多

weixin_36020178的博客 614

从真题到策略:浙江工业大学计算机转专业机试全解析与备考指南

本文全面解析浙江工业大学计算机转专业机试的考试概况、典型真题和高频考点,提供详细的备考策略和面试准备建议。从机试题目类型到解题技巧,帮助考生高效备考,顺利通过这一竞争激烈的转专业关卡。

weixin_42524824的博客 421

Go基础系列:互斥锁Mutex和读写锁RWMutex用法详述

sync.Mutex Go中使用sync.Mutex类型实现mutex(排他锁、互斥锁)。在源代码的sync/mutex.go文件中,有如下定义: // A Mutex is a mutual exclusion lock. // The zero value for a Mutex is an unlocked mutex. // // A Mutex must not be copied a...

weixin_34290096的博客 478

链家二手房信息爬取(内附完整代码)

链家二手房信息爬取1.简介2. 爬虫思路2.1 网页分析2.2 详情页分析2.3 不同页码的爬取2.4 解决链家只显示100页数据2.5 简单的反爬与进度条显示3. 总结 1.简介   最近帮同学爬取了链家在售二手房的信息,这是本人学习爬虫以来爬取数据最多的一次,就想着写个博客记录一下。   本次爬虫是利用python+jupyter notebook实现的,用到的第三方库如下: import pandas as pd # 数据存储 import requests # 网页内容获取 import re #

qq_46256922的博客 3万+

四足机器人如何用对抗运动先验(AMP)实现复杂地形行走?Unitree Go1实战解析

本文深入解析了四足机器人Unitree Go1如何通过对抗运动先验(AMP)算法实现复杂地形行走。AMP结合模仿学习与对抗训练,使机器人仅凭本体感知就能适应未知地形。文章详细介绍了AMP的核心架构、仿真训练工程实践以及在Unitree Go1上的部署优化方案,展示了其在极端地形下的卓越性能表现。

weixin_29050513的博客 328

Go语言基础之13--线程安全及互斥锁和读写锁

一、线程安全介绍 1.1 现实例子 A. 多个goroutine同时操作一个资源,这个资源又叫临界区 B. 现实生活中的十字路口,通过红路灯实现线程安全 C. 火车上的厕所(进去之后先加锁,在上厕所,不加锁两个人都进去就出问题了,出来后在解锁,别人就可以使用了),通过互斥锁来实现线程安全 D、在程序中,同一个变量多个goroutine去修改的时候,肯定是不允许同时修改的,同时修...

weixin_30781433的博客 109

(五)深入理解蓝牙BLE之“Beacon包格式详解”

蓝牙Beacon格式详解 本文重点在结合Bluetooth官网spec和几个例子来使beacon帧格式更加容易被理解。 广播帧格式: 首先beacon是蓝牙BLE广播包的一种,蓝牙广播帧格式如下: PS:其实BLE数据帧除了报头字段和数据字段定义与广播帧不同之外,前导/接入地址/长度/校验格式均相同。 广播帧数据字段格式: 数据字段最长为37个字节:6个字节的广播设备地址 + 31个字节广播数据。 广播数据的格式如下:AD Structure1 +AD Structure2 + .....

1万+

Go基础系列:互斥锁Mutex和读写锁RWMutex用法详述(一)

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_34143774的博客 192

CPU 访问外设的两种核心机制:MMIO(Memory-Mapped I/O) 和 DMA(Direct Memory Access)

BAR和DMA是计算机系统中两种关键的数据传输机制:BAR(基址寄存器)用于CPU与设备间的控制通信,映射设备寄存器便于配置操作;而DMA(直接内存访问)允许设备直接读写系统内存,无需CPU参与大量数据传输。典型场景如NVMe SSD读取数据时,CPU通过BAR下发指令,设备通过DMA高效传输数据到主机内存,最后中断通知CPU。虽然BAR能映射大内存空间,但仍无法替代DMA的高效数据传输功能,两者各司其职——BAR负责控制,DMA专注数据传输,共同实现高性能的硬件交互。

MHD0815的博客 237

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

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

前言 Golang中有两种类型的锁,Mutex (互斥锁)和RWMutex(读写锁)对于这两种锁的使用这里就不多说了,本文主要侧重于从源码的角度分析这两种锁的具体实现。 引子问题 我一般喜欢带着问题去看源码。那么对于读写锁,你是否有这样的问题,为什么可以有多个读锁?有没有可能出现有协程一直无法获取到写锁的情况?带着你的疑问来往下看看,具体这个锁是如何实现的。 如果你自己想看,我给出阅...

weixin_30376163的博客 394

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

go语言基础-----18-----协程安全、互斥锁、读写锁、匿名锁、sync.Once

1 线程安全-互斥锁 竞态检查工具是基于运行时代码检查,而不是通过代码静态分析来完成的,可以添加-race 来执行竞态检测。但是对于那些没 有机会运行到的代码逻辑中如果存在安全隐患,即使加了-race,它也是检查不出来的。 例如下面例子,多个协程不加锁的情况下,对map进行读写操作,必定会报竞态错误,不过需要加上-race,否则看不到对应的错误。想要解决竞态错误很简单,自己添加一把互斥锁即可。 PS:-race只能在运行时触发,在启用情况下其CPU和内存通常是正常程序的5~10倍,故生产环境不宜使用。 如果

weixin_44517656的博客 3387

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

r1笔记第9天 Golang(09)

下面开始进入 包的学习: 1、golang中的包 a、golang目前有150个标注你的包,覆盖了几乎所有的基础库。 b、golang.org有所有包的文档。 2、线程同步: a、import("sync") b、互斥锁,var mu sync.Mutex: 写多读少的情况下,用互斥锁。 c、读写锁, var mu syn...

qq_36133447的博客 162

【Go】-go中的锁机制

简单的说方法内联就是将被调用方函数代码“复制”到调用方函数中,减少函数调用开销,在2018年之前的go版本中,所有的逻辑都在Lock函数中,并没有拆出来,2018年之后Go开发者将slow path拆出来,当lock方法被频繁调用的时候,有两种情况,如果直接获得锁走的是fast path,这个时候内联就只有fast path 的代码,这样会减少方法调用的堆栈空间和时间的消耗 ,如果处于自旋,锁竞争的情况下,走的是slow path,这个时候才会把lock slow 的方法内联进来,这样方便了编译器做内联。

knoci的博客 1805

Go :标准库Sync简介与实践

Golang sync包提供了基础的异步操作方法,包括互斥锁Mutex,执行一次Once和并发等待组WaitGroup。Mutex: 互斥锁RWMutex:读写锁WaitGroup:并发等待组Once:执行一次Cond:信号量Pool:临时对象池Map:自带锁的map。

GIS摆渡人 263
上一篇: golang操作Redis&Mysql&RabbitMQ
下一篇: golang聊天室的搭建(实现room,群聊,指定room推送)加锁版本
yí無所冇
博客等级 码龄9年 78粉丝 92原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值