阿里云-云小站(无限量代金券发放中)
【腾讯云】云服务器、云数据库、COS、CDN、短信等热卖云产品特惠抢购

简单探讨Go语言线程安全之互斥锁与读写锁

309次阅读
没有评论

共计 1962 个字符,预计需要花费 5 分钟才能阅读完成。

导读 这篇文章主要介绍了 Go 语言线程安全之互斥锁与读写锁, 互斥锁是为了并发的安全, 在多个 goroutine 共同工作的时候, 对于共享的数据十分不安全, 而读写锁效率革命,使用锁的时候,安全与效率往往需要互相转换,下文详细内容,需要的小伙伴可以参考一下

单个线程时数据操作的只有一个线程, 数据的修改也只有一个线程参与,数据相对来说是安全的, 多线程时对数据操作的不止一个线程, 所以同时对数据进行修改的时候难免紊乱

一、互斥锁是什么?
1. 概念

互斥锁是为了并发的安全, 在多个 goroutine 共同工作的时候, 对于共享的数据十分不安全写入时容易因为竞争造成数据不必要的丢失。互斥锁一般加在共享数据修改的地方。

2. 未加锁

线程不安全, 操作的全局变量会计算异常

package main
 
import (
    "fmt"
    "sync"
)
 
var x int = 0
 
var wg sync.WaitGroup
 
func add() {defer wg.Done()
    for i := 0; i 
3. 加锁之后

线程安全, 全局变量计算无异常

package main
 
import (
    "fmt"
    "sync"
)
 
var x int = 0
 
var wg sync.WaitGroup
 
// 创建一个锁对象
var lock sync.Mutex
 
func add() {defer wg.Done()
    for i := 0; i 
二、读写锁【效率革命】
1. 为什么读写锁效率高

使用锁的时候,安全与效率往往需要互相转换,对数据进行操作的时候, 只会进行数据的读与写。而读与读之间可以同时进行,读与写之间需要保证写的时候不去读。此时为了提高效率就发明读写锁, 在读写锁机制下, 安全没有丝毫降低,但效率进行了成倍的提升提升的效率在读与写操作次数差异越大时越明显

2. 使用方法

代码如下(示例):

package main
 
import (
    "fmt"
    "sync"
    "time"
)
 
var (
    x      = 0
    rwlock sync.RWMutex
    wg     sync.WaitGroup
)
 
func write() {defer wg.Done()
    rwlock.Lock()
    x++
    rwlock.Unlock()}
 
func read() {wg.Done()
    // 开启读锁
    rwlock.RLock()
    fmt.Println(x)
    // 释放读锁
    rwlock.RUnlock()}
func main() {start := time.Now()
    for i := 0; i 
三、sync.once
1.sync.once 产生背景

在多个 goroutine 中往往会由于线程不同步造成数据读写的冲突, 特别是在进行文件打开对象创建的时候,可能会造成向关闭的文件写内容,使用未初始化的对象,或者对一个对象进行多次初始化。

2.sync.once 机制概述

sync.once 保证函数内的代码只执行一次,实现的机制是在 once 内部有一个标志位, 在执行代码的时候执行一次之后标志位将置为 1 后续判断标志位, 如果标志位被改为 1 则无法再进行操纵

3.sync.once 注意点

sync.Once.Do() 传进去的函数参数无参无返,一个 once 对象只能执行一次 Do 方法, 向 Do 方法内传多个不同的函数时只能执行第一个传进去的,传进去 Do 方法的函数无参无返, 可以用函数闭包把需要的变量传进去

4. 使用方法

一般结合并发使用, 旨在对通道或文件只进行一次关闭

func f2(a 
四、atomic 原子包操作

原子包将指定的数据进行安全的加减交换操作;网上还有一大堆关于原子包的 api 感兴趣的小伙伴可以自行百度, 这里就不细细阐述了

package main
 
import (
    "fmt"
    "sync"
    "sync/atomic"
)
 
var x int64 = 0
 
var wg sync.WaitGroup
 
/*
    原子操作是将数据进行打包枷锁, 直接通过指定的函数进行相应的操作
    可以使用 load 读取、store 写入、add 修改、swap 交换。// 类似于读取一个变量、对一个变量进行赋值
*/
func addone() {
    // 没有加锁进行并发的话,会产生数据丢失的情况
    defer wg.Done()
    // x++
 
    // 不用加锁也可以使用的行云流水
    // 第一个参数是进行操作的数据, 第二个是增加的步长
    atomic.AddInt64(&x, 1)
 
}
func csf() {
    // 进行比较相等则将新值替换旧值
    ok := atomic.CompareAndSwapInt64(&x, 100, 200)
    fmt.Println(ok, x)
}
 
func main() {
    for i := 0; i 
总结:

读写锁区分读者和写者,而互斥锁不区分 互斥锁同一时间只允许一个线程访问该对象,无论读写;读写锁同一时间内只允许一个写者,但是允许多个读者同时读对象。联系:读写锁在获取写锁的时候机制类似于互斥锁。

阿里云 2 核 2G 服务器 3M 带宽 61 元 1 年,有高配

腾讯云新客低至 82 元 / 年,老客户 99 元 / 年

代金券:在阿里云专用满减优惠券

正文完
星哥玩云-微信公众号
post-qrcode
 0
星锅
版权声明:本站原创文章,由 星锅 于2024-07-25发表,共计1962字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
【腾讯云】推广者专属福利,新客户无门槛领取总价值高达2860元代金券,每种代金券限量500张,先到先得。
阿里云-最新活动爆款每日限量供应
评论(没有评论)
验证码
【腾讯云】云服务器、云数据库、COS、CDN、短信等云产品特惠热卖中

星哥玩云

星哥玩云
星哥玩云
分享互联网知识
用户数
4
文章数
19351
评论数
4
阅读量
7976388
文章搜索
热门文章
星哥带你玩飞牛NAS-6:抖音视频同步工具,视频下载自动下载保存

星哥带你玩飞牛NAS-6:抖音视频同步工具,视频下载自动下载保存

星哥带你玩飞牛 NAS-6:抖音视频同步工具,视频下载自动下载保存 前言 各位玩 NAS 的朋友好,我是星哥!...
星哥带你玩飞牛NAS-3:安装飞牛NAS后的很有必要的操作

星哥带你玩飞牛NAS-3:安装飞牛NAS后的很有必要的操作

星哥带你玩飞牛 NAS-3:安装飞牛 NAS 后的很有必要的操作 前言 如果你已经有了飞牛 NAS 系统,之前...
我把用了20年的360安全卫士卸载了

我把用了20年的360安全卫士卸载了

我把用了 20 年的 360 安全卫士卸载了 是的,正如标题你看到的。 原因 偷摸安装自家的软件 莫名其妙安装...
再见zabbix!轻量级自建服务器监控神器在Linux 的完整部署指南

再见zabbix!轻量级自建服务器监控神器在Linux 的完整部署指南

再见 zabbix!轻量级自建服务器监控神器在 Linux 的完整部署指南 在日常运维中,服务器监控是绕不开的...
飞牛NAS中安装Navidrome音乐文件中文标签乱码问题解决、安装FntermX终端

飞牛NAS中安装Navidrome音乐文件中文标签乱码问题解决、安装FntermX终端

飞牛 NAS 中安装 Navidrome 音乐文件中文标签乱码问题解决、安装 FntermX 终端 问题背景 ...
阿里云CDN
阿里云CDN-提高用户访问的响应速度和成功率
随机文章
浏览器自动化工具!开源 AI 浏览器助手让你效率翻倍

浏览器自动化工具!开源 AI 浏览器助手让你效率翻倍

浏览器自动化工具!开源 AI 浏览器助手让你效率翻倍 前言 在 AI 自动化快速发展的当下,浏览器早已不再只是...
星哥带你玩飞牛NAS-16:不再错过公众号更新,飞牛NAS搭建RSS

星哥带你玩飞牛NAS-16:不再错过公众号更新,飞牛NAS搭建RSS

  星哥带你玩飞牛 NAS-16:不再错过公众号更新,飞牛 NAS 搭建 RSS 对于经常关注多个微...
星哥带你玩飞牛NAS-4:飞牛NAS安装istore旁路由,家庭网络升级的最佳实践

星哥带你玩飞牛NAS-4:飞牛NAS安装istore旁路由,家庭网络升级的最佳实践

星哥带你玩飞牛 NAS-4:飞牛 NAS 安装 istore 旁路由,家庭网络升级的最佳实践 开始 大家好我是...
150元打造低成本NAS小钢炮,捡一块3865U工控板

150元打造低成本NAS小钢炮,捡一块3865U工控板

150 元打造低成本 NAS 小钢炮,捡一块 3865U 工控板 一块二手的熊猫 B3 工控板 3865U,搭...
飞牛NAS中安装Navidrome音乐文件中文标签乱码问题解决、安装FntermX终端

飞牛NAS中安装Navidrome音乐文件中文标签乱码问题解决、安装FntermX终端

飞牛 NAS 中安装 Navidrome 音乐文件中文标签乱码问题解决、安装 FntermX 终端 问题背景 ...

免费图片视频管理工具让灵感库告别混乱

一言一句话
-「
手气不错
免费无广告!这款跨平台AI RSS阅读器,拯救你的信息焦虑

免费无广告!这款跨平台AI RSS阅读器,拯救你的信息焦虑

  免费无广告!这款跨平台 AI RSS 阅读器,拯救你的信息焦虑 在算法推荐主导信息流的时代,我们...
开发者福利:免费 .frii.site 子域名,一分钟申请即用

开发者福利:免费 .frii.site 子域名,一分钟申请即用

  开发者福利:免费 .frii.site 子域名,一分钟申请即用 前言 在学习 Web 开发、部署...
零成本上线!用 Hugging Face免费服务器+Docker 快速部署HertzBeat 监控平台

零成本上线!用 Hugging Face免费服务器+Docker 快速部署HertzBeat 监控平台

零成本上线!用 Hugging Face 免费服务器 +Docker 快速部署 HertzBeat 监控平台 ...
星哥带你玩飞牛NAS硬件02:某鱼6张左右就可拿下5盘位的飞牛圣体NAS

星哥带你玩飞牛NAS硬件02:某鱼6张左右就可拿下5盘位的飞牛圣体NAS

星哥带你玩飞牛 NAS 硬件 02:某鱼 6 张左右就可拿下 5 盘位的飞牛圣体 NAS 前言 大家好,我是星...
150元打造低成本NAS小钢炮,捡一块3865U工控板

150元打造低成本NAS小钢炮,捡一块3865U工控板

150 元打造低成本 NAS 小钢炮,捡一块 3865U 工控板 一块二手的熊猫 B3 工控板 3865U,搭...