Go 语言中的锁

1. 并发基础

并发是同时发生多个计算或事件的能力。并发通常通过同时执行多个任务或进程来实现,这些任务或进程共享相同的资源(例如内存或处理器)。并发使用的基本机制被称为锁。在Go语言中,锁是一个类型变量,它包含一个内部计数器,用于跟踪已获取的锁的数量。当一个goroutine获取一个锁时,它会将计数器增加一;当一个goroutine释放一个锁时,它会将计数器减少一。

2. 锁类型

Go语言中提供了五种类型的锁:互斥锁(mutex)、读写锁(RWMutex)、等待组(WaitGroup)、一次性锁(Once)和条件变量(Cond)。

  • 互斥锁(mutex)是一个基础的锁,它只能被一个goroutine同时持有。如果另一个goroutine试图获取一个已被持有的互斥锁,它将被阻塞,直到持有锁的goroutine释放锁。
package mainimport ("fmt""sync"
)func main() {// 创建一个互斥锁var mutex sync.Mutex// 使用互斥锁保护共享资源mutex.Lock()fmt.Println("Only one goroutine can access the shared resource at a time.")mutex.Unlock()
}
  • 读写锁(RWmutex)是一种更高级的锁,它允许多个goroutine同时读取受保护的数据,但只允许一个goroutine同时写入受保护的数据。这可以提高程序的性能,因为读取操作通常比写入操作要快。
package mainimport ("fmt""sync"
)func main() {// 创建一个读写锁var rwmutex sync.RWMutex// 使用读写锁保护共享资源rwmutex.RLock()fmt.Println("Multiple goroutines can read the shared resource at the same time.")rwmutex.RUnlock()// 使用写锁保护共享资源rwmutex.Lock()fmt.Println("Only one goroutine can write to the shared resource at a time.")rwmutex.Unlock()
}
  • 等待组(WaitGroup)是一个同步原语,它允许一个goroutine等待其他一组goroutine完成。
package mainimport ("sync""fmt"
)var wg sync.WaitGroupfunc main() {// 创建10个goroutine来并发地执行任务for i := 0; i < 10; i++ {wg.Add(1) // 告诉等待组有1个goroutine需要等待go func() {// 执行任务fmt.Println("Hello, world!")wg.Done() // 告诉等待组当前goroutine已完成}()}// 等待所有goroutine完成wg.Wait()fmt.Println("All goroutines have finished.")
}
  • 一次性锁(Once)是一个同步原语,它确保某个操作只被执行一次。
package mainimport ("sync""fmt"
)var once sync.Oncefunc main() {// 只执行一次init函数once.Do(func() {fmt.Println("Hello, world!")})
}
  • 条件变量(Cond)是一种同步原语,它允许一个goroutine等待某个条件满足。
package mainimport ("sync""fmt""time"
)var cond = sync.NewCond(&sync.Mutex{})
var count intfunc main() {go func() {// 等待count大于0cond.L.Lock()for count <= 0 {cond.Wait()}cond.L.Unlock()fmt.Println("Count is greater than 0.")}()// 将count设置为1,并通知等待的goroutinetime.Sleep(1 * time.Second)cond.L.Lock()count = 1cond.Signal()cond.L.Unlock()
}

3.锁的注意事项

  • 死锁:死锁是指两个或多个goroutine相互等待对方释放锁,从而导致程序永远无法继续执行。为了避免死锁,必须确保每个goroutine在释放一个锁之前都必须获取该锁。
  • 锁争用:锁争用是指多个goroutine同时尝试获取同一个锁,从而导致程序性能下降。为了减少锁争用,可以尽量使用读写锁,并减少锁的持有时间。
  • 锁粒度:锁粒度是指锁保护的资源的范围。锁粒度越小,对程序并发性的影响就越小。因此,在选择锁的类型和粒度时,应权衡锁的性能和并发性。

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

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

相关文章

Redis 淘汰策略有哪些?

Redis 淘汰策略有哪些&#xff1f; Redis 中有多种淘汰策略&#xff08;Eviction Policy&#xff09;&#xff0c;用于在内存不足时选择要移除的键值对。以下是一些常见的淘汰策略&#xff1a; No Eviction&#xff08;无淘汰&#xff09;&#xff1a; 默认策略&#xff0c;当…

如何使用人工智能优化 DevOps?

DevOps 和人工智能密不可分&#xff0c;影响着各种业务。DevOps 可以加快产品开发速度并简化现有部署的维护&#xff0c;而 AI 则可以改变整个系统的功能。DevOps团队可以依靠人工智能和机器学习来进行数据集成、测试、评估和发布系统。更重要的是&#xff0c;人工智能和机器学…

轻松掌握构建工具:Webpack、Gulp、Grunt 和 Rollup 的使用技巧(下)

&#x1f90d; 前端开发工程师&#xff08;主业&#xff09;、技术博主&#xff08;副业&#xff09;、已过CET6 &#x1f368; 阿珊和她的猫_CSDN个人主页 &#x1f560; 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 &#x1f35a; 蓝桥云课签约作者、已在蓝桥云…

【大厂算法面试冲刺班】day0:数据范围反推时间复杂度

常见算法的时间复杂度 规定n是数组的长度/树或图的节点数 二分查找&#xff1a;O(logn) 双指针/滑动窗口&#xff1a;O(n) DFS/BFS&#xff1a;O(n) 构建前缀和&#xff1a;O(n) 查找前缀和&#xff1a;O(1) 一维动态规划&#xff1a;O(n) 二维动态规划&#xff1a;O(n^2) 回溯…

【深度学习每日小知识】Logistic Loss 逻辑回归

逻辑回归的损失函数 线性回归的损失函数是平方损失。逻辑回归的损失函数是对数损失&#xff0c;定义如下&#xff1a; L o g L o s s ∑ ( x , y ) ∈ D − y log ⁡ ( y ′ ) − ( 1 − y ) log ⁡ ( 1 − y ′ ) LogLoss\sum_{(x,y)\in D}-y\log(y)-(1-y)\log(1-y) LogLoss…

卡尔曼滤波:理论与代码

卡尔曼滤波&#xff1a;理论与代码 引言 卡尔曼滤波是一种用于估计系统状态的优化技术&#xff0c;特别适用于含有噪声的测量数据和系统动态变化的情况。本文将简单探讨卡尔曼滤波的理论基础、数学公式的推导&#xff0c;并通过Python代码示例演示其在实际应用中的效果。 一…

基于SSM+vue的篮球场预约管理系统(Java毕业设计)

大家好&#xff0c;我是DeBug&#xff0c;很高兴你能来阅读&#xff01;作为一名热爱编程的程序员&#xff0c;我希望通过这些教学笔记与大家分享我的编程经验和知识。在这里&#xff0c;我将会结合实际项目经验&#xff0c;分享编程技巧、最佳实践以及解决问题的方法。无论你是…

Python 最新版本 3.12.1 环境配置(windows)

文章目录 python 3.12.1环境安装3.12.1 网盘下载3.12.1 官网下载 python 安装完成测试第一个 python 程序Hello Python python 3.12.1环境安装 3.12.1 网盘下载 python 3.12.1 百度网盘地址&#xff1a;https://pan.baidu.com/s/1SAcH_uH0T3DiERn6AZeQlg?pwd4242 提取码&a…

不同activity项目创建时的区别

在 Android Studio 中创建项目时&#xff0c;可以选择创建不同类型的 Activity 作为应用程序的入口点。其中&#xff0c;包括 Empty Activity、Basic Activity、Empty Compose Activity 和 Basic Compose Activity 四种类型。 Empty Activity&#xff1a;这是最简单的 Activity…

最新靠谱可用的-Mac-环境下-FFmpeg-环境搭建

最近在尝试搭建 FFmpeg 开发环境时遇到一个蛋疼的事&#xff0c;Google 了 N 篇文章竟然没有一篇是可以跑起来的&#xff01; 少部分教程是给出了自我矛盾的配置&#xff08;是的&#xff0c;按照贴出来的代码和配置&#xff0c;他自己都跑不起来&#xff09;&#xff0c;大部…

【Leetcode】2182. 构造限制重复的字符串

文章目录 题目思路代码 题目 2182. 构造限制重复的字符串 问题&#xff1a;给你一个字符串 s 和一个整数 repeatLimit &#xff0c;用 s 中的字符构造一个新字符串 repeatLimitedString &#xff0c;使任何字母 连续 出现的次数都不超过 repeatLimit 次。你不必使用 s 中的全…

关于在前台应用路由调用子应用

需求 在实际写项目的过程中&#xff0c;关于一些前台的官网首页&#xff0c;会需要在一写特定的路由侠调用子应用的需求&#xff0c;在编写的过程中在公用的方法中&#xff0c;来进行处理&#xff0c;处理思想如下&#xff0c;在特定的.vue文件中&#xff0c; 后端 通过后端…

【新年福利】买1送1,告别360!这个系统清理神器干净无广告!

在日常的工作中&#xff0c;面对重要文件时往往都会备份一份&#xff1b;在下载文件时&#xff0c;有时也会不小心把一份文件下载好多次。这些情况会导致电脑中出现重复的文件&#xff0c;删除这些重复文件&#xff0c;可以节省电脑空间&#xff0c;帮助提高电脑运行速度。那么…

人机协同若干问题的分析

一、人机协同的发展态势 人机协同的发展态势是指人类和机器之间合作和协同工作的趋势和动态。 1、增强人类能力 机器可以通过智能算法、大数据分析和机器学习等技术来增强人类的能力。例如&#xff0c;人工智能可以帮助医生更准确地诊断疾病&#xff0c;或者帮助律师更高效地处…

mysql关于创建表的小试题

目录 例题&#xff1a; 解题思路及步骤&#xff1a; 实验步骤&#xff1a; 步骤一&#xff1a;创建数据库 步骤二&#xff1a;创建表 步骤三&#xff1a;插入数据 例题&#xff1a; 1、创建一个英雄表(hero)&#xff0c;管于四大名著的主键 nam…

2-《Java并发编程实战》(Java Concurrency in Practice) 代码示例

说明 这是针对《Java并发编程实战》(Java Concurrency in Practice)一书中的示例代码进行扩展&#xff0c;并且进行验证的完整代码&#xff0c;具体背景可看这篇文章&#xff1a;1-《Java并发编程实战》(Java Concurrency in Practice) 代码示例 下面的示例代码都是针对书中的&…

白学的小知识[css3轮播]

代码如下: <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>轮播</title><style>.boss {position: relative;width: 200px;height: 200px;overflow: hidden;}.boss>div {width: 10000p…

pytest-mock 数据模拟

文章目录 mock 测试unittest.mockMock类MagicMock类patch装饰器create_autospec函数断言的方法 pytest-mock 使用 mock 测试 在单元测试时&#xff0c;有些数据需要依赖其他服务或者不好获取到&#xff0c;此时需要使用mock来模拟对应的函数、对象等。 mock模拟数据的python…

71、C++ 环境搭建:10分钟快速在 windows 上安装一个 Linux 系统

这一节带大家搭建一个统一的 C++ 环境。 因为不少人用的 C++ 环境都不一样,用的编译器、编辑器也都不一致,很难统一。我在准备写这篇的时候,思考了很久,最终决定搭建一个统一的环境,希望大家后面在运行和调试C++代码时,可以参考这个环境来进行。 如果你是 linux 老用户…

Android Studio个性化修改

Android Studio原始界面看着也太无趣了叭&#xff0c;话不多说跟步骤走就可以。 1.更改Android Studio主题及背景 1.背景修改 File->Settings->Plugins&#xff0c;搜索Sexy Editor 重启后&#xff0c;左侧边栏出现Other Settings选项&#xff0c;点击SexyEditor进行背…