GO sync包——读写锁

news2024/11/17 7:42:21

在这里插入图片描述
💝💝💝欢迎莅临我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。
在这里插入图片描述

  • 推荐:「stormsha的主页」👈,持续学习,不断总结,共同进步,为了踏实,做好当下事儿~

  • 专栏导航

    • Python系列: Python面试题合集,剑指大厂
    • Git系列: Git操作技巧
    • GO系列: 记录博主学习GO语言的笔记,该笔记专栏尽量写的试用所有入门GO语言的初学者
    • 数据库系列: 详细总结了常用数据库 mysql 技术点,以及工作中遇到的 mysql 问题等
    • 运维系列: 总结好用的命令,高效开发
    • 算法与数据结构系列: 总结数据结构和算法,不同类型针对性训练,提升编程思维

    非常期待和您一起在这个小小的网络世界里共同探索、学习和成长。💝💝💝 ✨✨ 欢迎订阅本专栏 ✨✨

    💖The Start💖点点关注,收藏不迷路💖

    📒文章目录

      • 互斥锁(Mutex)
        • 使用技巧
        • 示例代码
      • 读写锁(RWMutex)
        • 使用技巧
        • 示例代码
      • 条件变量(Cond)
        • 使用技巧
        • 示例代码
      • 一次性初始化(Once)
        • 使用技巧
        • 示例代码
      • 总结


内容内容内容内容内容内容内容内容内容内容内容内容内容内容内容内容内容内容内容
Go 语言以其简洁和高效著称,在并发编程方面,Go 提供了一套强大的工具和库来帮助开发者构建高性能的并发程序。sync 包是 Go 标准库中用于同步原语的一个包,它提供了互斥锁(Mutex)、读写锁(RWMutex)、条件变量(Cond)和一次性初始化(Once)等同步原语。本文将深入探讨 sync 包的一些高级使用技巧,旨在帮助开发者更好地理解和应用这些工具。

互斥锁(Mutex)

互斥锁是并发编程中最基本的同步机制之一。在 Go 中,sync.Mutex 提供了互斥锁的功能,用于保护共享资源不被多个 goroutine 同时访问。

使用技巧

  1. 避免死锁:在使用互斥锁时,确保在访问共享资源后立即释放锁,避免死锁的发生。
  2. 使用 defer 语句:在获取锁后,使用 defer 语句确保锁在函数返回时被释放,即使发生 panic 也能正确释放。
  3. 锁的粒度:尽量减小锁的范围,只锁定必要的代码段,以减少锁的争用。

示例代码

var mu sync.Mutex
var sharedResource int

func accessSharedResource() {
    mu.Lock()
    defer mu.Unlock()

    // 访问或修改共享资源
    sharedResource++
}

读写锁(RWMutex)

读写锁允许多个 goroutine 同时读取资源,但在写入时会独占资源。这在读取操作远多于写入操作的场景下非常有用。

使用技巧

  1. 写入时考虑性能:写入操作应该尽可能快,以减少写锁持有的时间。
  2. 避免写入时的读取:在写锁持有期间,避免其他 goroutine 读取资源,以防止数据不一致。

示例代码

var rwMutex sync.RWMutex
var sharedData map[string]int

func readData(key string) int {
    rwMutex.RLock()
    defer rwMutex.RUnlock()

    return sharedData[key]
}

func writeData(key string, value int) {
    rwMutex.Lock()
    defer rwMutex.Unlock()

    sharedData[key] = value
}

条件变量(Cond)

条件变量用于在 goroutine 之间同步条件。它允许一个或多个 goroutine 等待某个条件变为真,而其他 goroutine 可以唤醒等待的 goroutine。

使用技巧

  1. 与互斥锁结合使用:条件变量通常与互斥锁结合使用,以确保条件检查和通知的原子性。
  2. 避免竞态条件:在使用条件变量时,确保在检查条件和等待通知之间没有竞态条件。

示例代码

var cond *sync.Cond
var mutex sync.Mutex
var ready bool

func init() {
    cond = sync.NewCond(&mutex)
}

func waitForCondition() {
    mutex.Lock()
    for !ready {
        cond.Wait()
    }
    mutex.Unlock()
}

func signalCondition() {
    mutex.Lock()
    ready = true
    cond.Signal()
    mutex.Unlock()
}

一次性初始化(Once)

sync.Once 用于确保初始化操作只执行一次,这对于全局变量的初始化非常有用。

使用技巧

  1. 避免重复初始化Once 确保即使多次调用,初始化函数也只会执行一次。
  2. 初始化全局变量:使用 Once 来初始化需要延迟加载的全局变量。

示例代码

var once sync.Once
var globalResource *Resource

func initGlobalResource() {
    globalResource = NewResource()
}

func useGlobalResource() {
    once.Do(initGlobalResource)
    // 使用globalResource
}

总结

Go 的 sync 包提供了强大的同步原语,帮助开发者构建安全且高效的并发程序。理解并掌握这些同步原语的使用技巧,可以显著提升并发程序的性能和稳定性。希望本文能为开发者在使用 sync 包时提供一些有价值的指导和启发。


🔥🔥🔥道阻且长,行则将至,让我们一起加油吧!🌙🌙🌙

💖The End💖点点关注,收藏不迷路💖

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1864572.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

OpenCV-Python——环境配置及图像基本操作

一、环境配置 1、在虚拟环境中安装以下库: opencv-python3.4.1.15 opencv-contrib-python3.4.1.15 建议安装3.4.1的版本,3.4.2之后的版本做了专利保护,有的功能不能实现。 虚拟环境的安装以及安装库的问题见PyQt5专栏中的第一节。 2、安…

Pytest+Allure+Yaml+Jenkins+Gitlab接口自动化中Jenkins配置

一、背景 Jenkins(本地宿主机搭建) 拉取GitLab(服务器)代码到在Jenkins工作空间本地运行并生成Allure测试报告 二、框架改动点 框架主运行程序需要先注释掉运行代码(可不改,如果运行报allure找不到就直接注释掉) …

使用命令行创建uniapp+TS项目,使用vscode编辑器

一:如果没有pnpm,先安装pnpm 二:使用npx工具和degit工具从 GitHub 上的 dcloudio/uni-preset-vue 仓库克隆一个名为 vite-ts 的分支,到项目中. 执行完上面命令后,去manifest.json添加appid(自己微信小程序的Id),也可不执行直接下一步,执行pnpm install ,再执行pnpm:dev:mp-weix…

BW:CP里添加信息对象小问题记录

之前做视图直接添加进CP里,以为不能直接往CP里加信息对象,还专门建了一个带信息对象的模型,把信息对象拖到CP里,然后再链接视图的字段 今天发现原来不用这样,直接加就可以,小记一下 如图直接诶创建&#x…

虚拟化 之八 详解构造带有 jailhouse 的 openEuler 发行版(ARM 飞腾派)

基本环境 嵌入式平台下,由于资源的限制,通常不具备通用性的 Linux 发行版,各大主流厂商都会提供自己的 Linux 发行版。这个发行版通常是基于某个 Linux 发行版构建系统来构建的,而不是全部手动构建,目前主流的 Linux 发行版构建系统是 Linux 基金会开发的 Yocto 构建系统。…

Revit插件|建模助手「综合模块」30+个功能全面免费

噢~我的伙计们,快来猜猜是谁快满三岁了?没错,咱们的得力干将——Revit插件「建模助手」!这三年里,【综合】模块就像那个超受欢迎的小兄弟,帮了大家大忙。说起来都激动,到今年5月底,它…

高考填报志愿的纠结,钱途重要还是兴趣爱好重要?

不管考得好不好,都会纠结怎么填报学校怎么填报专业,毕竟这与未来息息相关,这决定了未来的就业方向。为了好好规划未来,很多人会在此时犹豫不决,不知道到底是结合就业前景来安排好,还是根据个人的喜好来安排…

告别质量烦恼,精益生产培训帮你打造品质传奇!

在企业运营的复杂环境中,我们常常会观察到一种现象:尽管团队全力以赴,但效率和效果却难以达到预期。这时,精益生产(Lean Production)的理念和方法就显得尤为重要。 精益生产简介 精益生产并非只适用于大…

探索网络爬虫技术:原理、实践与挑战

一、引言 在数字化时代,信息如同潮水般汹涌而来。过去,我们可能依赖书籍、报纸或电视来获取信息,但这些渠道的信息量有限,而且筛选过的信息未必能满足我们的需求。如今,互联网为我们提供了海量的信息,但同…

Linux网络-网络层IP协议、数据链路层以太网协议、ARP协议、ICMP协议和NAT技术

文章目录 前言一、IP协议IP报头解析4位版本4位首部长度16位总长度8位生存时间8位协议16位首部校验和32位源IP地址和32位目标IP地址 网段划分子网-局域网子网掩码特殊的IP地址 公网IP地址与私网IP地址运营商路由路由表 数据链路层MAC帧格式局域网通信原理局域网数据碰撞 MTU分片…

AWS云中的VPC启用流日志保存S3(AWS中国云)

问题 需要在AWS中国云中对VPC启用流日志操作。 步骤 创建s3桶 这里设置一个s3桶名,创建即可。如果出现已存在具有相同名称的存储桶错误,就换个桶名再试一试吧。 启用vpc流日志 找到vpc流日志入口操作,如下图: 设置vpc流日志…

基于requests模块爬取网易云歌曲评论并制作热词云图

本实践大作业要求 本次实践大作业主要要求主要包括: 1、选择一个热点或者你感兴趣的主题作为本次爬虫实践作业要完成的任务。 2、为了完成本次任务,需要确定从网上爬取的数据对象与范围。 3、利用python及网络爬虫相关技术实现从网上爬取相应内容数据。 …

JJ-20H型水泥胶砂搅拌机

一、 用途和适用范围 水泥胶砂搅拌机是根据中国建材院水泥所的统一图纸制造,符合我国执行国际强度试验方法(ISO679)的标准设备。也可代替 JC/T722 用作GB/T17671 水泥胶砂试验方法的搅拌机。并可用作美国标准、欧洲标准、日本标准水泥试验的净…

如何从0构建一款类jest工具

Jest工作原理 Jest 是一个流行的 JavaScript 测试框架,特别适用于 React 项目,但它也可以用来测试任何 JavaScript 代码。Jest 能够执行用 JavaScript 编写的测试文件的原因在于其设计和内部工作原理。下面是 Jest 的工作原理及其内部机制的详细解释&…

Jackson和fastjson解决序列化时字段属性大小写改变的问题

在部分特殊场景下,我们可能会把实体的字段属性改成全部大写,但是在返回前端时,字段会被序列化成小写。 比如我们有一个这个类属性都是大写: 后端接口是这样的 然后我们请求后,会发现我们的字段被变成全部小写的。 …

Baidu Comate最详细教程(含license码)!扫二维码即可得文心4.0 VIP90天免费使用

Baidu Comate最详细教程(含license码)!扫二维码即可得文心4.0 VIP90天免费使用 安装 方法一:点击链接 comate安装链接 方法二:扫描图片二维码 支持所有常见IDE,包括VSCode、JetBrains系列(包含…

【课程作业】嵌入式系统与设计上机作业(作业九十)

个人名片: 🎓作者简介:嵌入式领域优质创作者🌐个人主页:妄北y 📞个人QQ:2061314755 💌个人邮箱:[mailto:2061314755qq.com] 📱个人微信:Vir2025WB…

Qt实战项目——贪吃蛇

一、项目介绍 本项目是一个使用Qt框架开发的经典贪吃蛇游戏,旨在通过简单易懂的游戏机制和精美的用户界面,为玩家提供娱乐和编程学习的机会。 二、主要功能 2.1 游戏界面 游戏主要是由三个界面构成,分别是游戏大厅、难度选择和游戏内界面&a…

three.js 第六节 - 纹理以及贴图【.hdr文件(hdr贴图)】- 色彩空间

素材 这是素材 更多素材、案例、项目 好几个G一共,加我q178373168,60大洋拿走 源码 源码 // ts-nocheck // 引入three.js import * as THREE from three // 导入轨道控制器 import { OrbitControls } from three/examples/jsm/controls/OrbitControls…