广告
返回顶部
首页 > 资讯 > 后端开发 > GO >Go 互斥锁和读写互斥锁的实现
  • 202
分享到

Go 互斥锁和读写互斥锁的实现

2024-04-02 19:04:59 202人浏览 八月长安
摘要

目录互斥锁读写互斥锁 先来看这样一段代码,所存在的问题: var wg sync.WaitGroup var x int64 func main() { wg.Add(2)

先来看这样一段代码,所存在的问题:


var wg sync.WaitGroup
var x int64

func main() {
 wg.Add(2)
 Go f()
 go f()
 wg.Wait()
 fmt.Println(x) // 输出:12135
}

func f()  {
 for i:=0;i<10000;i++ {
  x = x+1
 }
 wg.Done() 
}

这里为什么输出是 12135(不同的机器结果不一样),而不是20000。

因为 x 的赋值,总共分为三个步骤:取出x的值、计算x的结果、给x赋值。那么由于对于f函数的调用采用了goroutine协程,所以存在资源竞争的问题,所以有赋值和计算过程中存在脏数据。对于此类的问题,可以采用互斥锁解决:

互斥锁

互斥锁是一种常用的控制共享资源访问的方法,它能够保证同时只有一个goroutine可以访问共享资源。Go语言中使用sync包的Mutex类型来实现互斥锁。


var wg sync.WaitGroup
var x int64
var lock sync.Mutex

func main() {
 wg.Add(2)
 go f()
 go f()
 wg.Wait()
 fmt.Println(x) // 输出:20000
}

func f()  {
 for i:=0;i<10000;i++ {
  lock.Lock() // 加互斥锁
  x = x+1
  lock.Unlock() // 解锁
 }
 wg.Done() 
}

使用互斥锁能够保证同一时间有且只有一个goroutine进入临界区,其他的goroutine则在等待锁;当互斥锁释放后,等待的goroutine才可以获取锁进入临界区,多个goroutine同时等待一个锁时,唤醒的策略是随机的。

读写互斥锁

互斥锁是完全互斥的,但是有很多实际的场景下是读多写少的,当我们并发的去读取一个资源不涉及资源修改的时候是没有必要加锁的,这种场景下使用读写锁是更好的一种选择。读写锁在Go语言中使用sync包中的RWMutex类型。

读写锁分为两种:读锁和写锁。当一个goroutine获取读锁之后,其他的goroutine如果是获取读锁会继续获得锁,如果是获取写锁就会等待;当一个goroutine获取写锁之后,其他的goroutine无论是获取读锁还是写锁都会等待。


var (
 x1 int64
 wg1 sync.WaitGroup
 lock1 sync.Mutex
 rwlock sync.RWMutex
)

func main() {
 startTime := time.Now()
 for i:=0;i<100;i++ {
  wg1.Add(1)
  write()
 }
 for i:=0;i<10000;i++ {
  wg1.Add(1)
  read()
 }
 wg1.Wait()
 fmt.Println(time.Now().Sub(startTime))

 // 互斥锁用时: 973.9304ms
 // 读写互斥锁用时: 718.094ms
}

func read()  {
 defer wg1.Done()
 //lock1.Lock() // 互斥锁
 rwlock.RLock() // 读写互斥锁
 fmt.Println(x1)
 //lock1.Unlock() // 互斥锁
 rwlock.RUnlock() // 读写互斥锁
}

func write()  {
 defer wg1.Done()
 lock1.Lock()
 x1 = x1+1
 lock1.Unlock()
}

到此这篇关于Go 互斥锁和读写互斥锁的实现的文章就介绍到这了,更多相关Go 互斥锁和读写互斥锁内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

您可能感兴趣的文档:

--结束END--

本文标题: Go 互斥锁和读写互斥锁的实现

本文链接: https://www.lsjlt.com/news/156010.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Go 互斥锁和读写互斥锁的实现
    目录互斥锁读写互斥锁 先来看这样一段代码,所存在的问题: var wg sync.WaitGroup var x int64 func main() { wg.Add(2)...
    99+
    2022-11-12
  • Go语言互斥锁与读写锁实例分析
    这篇“Go语言互斥锁与读写锁实例分析”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Go语言互斥锁与读写锁实例分析”文章吧。前...
    99+
    2023-06-29
  • Go语言互斥锁Mutex和读写锁RWMutex的用法
    这篇文章主要介绍“Go语言互斥锁Mutex和读写锁RWMutex的用法”,在日常操作中,相信很多人在Go语言互斥锁Mutex和读写锁RWMutex的用法问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操...
    99+
    2022-10-18
  • Go语言线程安全之互斥锁与读写锁
    目录一、互斥锁是什么?1.概念2.未加锁3.加锁之后二、读写锁【效率革命】1.为什么读写锁效率高2.使用方法三、sync.once1.sync.once产生背景2.sync.once...
    99+
    2022-11-13
  • Go语言并发编程之互斥锁Mutex和读写锁RWMutex
    目录一、互斥锁Mutex1、Mutex介绍2、Mutex使用实例二、读写锁RWMutex1、RWMutex介绍2、RWMutex使用实例在并发编程中,多个Goroutine访问同一块...
    99+
    2022-11-12
  • GO语言协程互斥锁Mutex和读写锁RWMutex怎么用
    本文小编为大家详细介绍“GO语言协程互斥锁Mutex和读写锁RWMutex怎么用”,内容详细,步骤清晰,细节处理妥当,希望这篇“GO语言协程互斥锁Mutex和读写锁RWMutex怎么用”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一...
    99+
    2023-06-30
  • Go与Redis实现分布式互斥锁和红锁
    目录前言互斥锁TryLock和Unlock实现Lock实现实现看门狗机制看门狗实现红锁加锁实现看门狗实现解锁实现前言 在项目中我们经常有需要使用分布式锁的场景,而Redis是实现分布式锁最常见的一种方式,这篇文章主要是使...
    99+
    2022-09-29
  • GO语言协程互斥锁Mutex和读写锁RWMutex用法实例详解
    sync.Mutex Go中使用sync.Mutex类型实现mutex(排他锁、互斥锁)。在源代码的sync/mutex.go文件中,有如下定义: // A Mutex is a m...
    99+
    2022-11-13
  • Golang函数的读写锁和互斥锁的使用心得
    在 Golang 中,锁(Lock)是并发控制的重要机制之一。锁本质上是一种同步原语,用于控制共享资源的访问。在实际应用中,常用的锁包括互斥锁(Mutex)和读写锁(RWLock)。本文将介绍 Golang 函数中读写锁和互斥锁的使用心得。...
    99+
    2023-05-17
    Golang 读写锁 互斥锁
  • GoLang中的互斥锁Mutex和读写锁RWMutex使用教程
    目录一、竞态条件与临界区和同步工具(1)竞态条件(2)临界区(3)同步工具二、互斥量三、使用互斥锁的注意事项(1)使用互斥锁的注意事项(2)使用defer语句解锁(3)sync.Mu...
    99+
    2023-01-09
    Go Mutex和RWMutex Go Mutex GoLang RWMutex
  • 如何理解互斥锁、自旋锁、读写锁、悲观锁、乐观锁的应用场景
    本篇内容主要讲解“如何理解互斥锁、自旋锁、读写锁、悲观锁、乐观锁的应用场景”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“如何理解互斥锁、自旋锁、读写锁、悲观锁、...
    99+
    2022-10-18
  • Go语言的互斥锁的详细使用
    目录前言Go语言互斥锁设计实现mutex介绍Lock加锁初始化状态自旋抢锁准备期望状态通过CAS操作更新期望状态解锁非阻塞加锁总结前言 当提到并发编程、多线程编程时,都会在第一时间想...
    99+
    2022-11-13
  • Go语言底层原理互斥锁的实现原理
    目录Go 互斥锁的实现原理?概念使用场景底层实现结构操作加锁解锁Go 互斥锁正常模式和饥饿模式的区别?正常模式(非公平锁)饥饿模式(公平锁)Go 互斥锁允许自旋的条件?Go 互斥锁的...
    99+
    2022-11-11
  • 如何理解Go里面的互斥锁mutex
    如何理解Go里面的互斥锁mutex,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。1. 锁的基础概念1.1 CAS与轮询1.1.1 cas实现锁 在锁的实现中现在越来越多的采用C...
    99+
    2023-06-19
  • golang并发安全及读写互斥锁的示例分析
    目录并发安全和锁互斥锁读写互斥锁并发安全和锁 有时候在Go代码中可能会存在多个goroutine同时操作一个资源(临界区),这种情况会发生竞态问题(数据竞态)。类比现实生活中的例子有...
    99+
    2022-11-13
  • Go语言文档解析:sync.Mutex函数实现互斥锁
    Go语言是一种开源的编程语言,其中使用了并发编程模型来处理多个任务之间的交替执行。在并发编程中,往往涉及到多个协程或线程同时访问共享资源的情况,此时就需要使用互斥锁来保证资源的独占性,避免竞态条件的发生。在Go语言中,提供了sync包来实现...
    99+
    2023-11-04
    Go语言 文档解析 syncMutex
  • Linux互斥锁的实现原理是什么
    本篇内容主要讲解“Linux互斥锁的实现原理是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Linux互斥锁的实现原理是什么”吧!互斥锁(Mutex)是在原子操作API的基础上实现的信号量行...
    99+
    2023-06-28
  • Go语言并发编程 互斥锁详情
    目录1、互斥锁Mutex 1.1 Mutex介绍 1.2 Mutex使用实例2、读写锁RWMutex 2.1 RWMutex介绍2.2 RWMutex使用实例1、互斥锁Mutex ...
    99+
    2022-11-12
  • Linux线程互斥锁的概念
    本篇内容介绍了“Linux线程互斥锁的概念”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!在编程中,引入了对象互斥锁的概念,来保证共享数据操作...
    99+
    2023-06-15
  • 举例讲解Python中的死锁、可重入锁和互斥锁
    一、死锁 简单来说,死锁是一个资源被多次调用,而多次调用方都未能释放该资源就会造成死锁,这里结合例子说明下两种常见的死锁情况。 1、迭代死锁 该情况是一个线程“迭代”请求同一个资源,直接就会造成死锁: ...
    99+
    2022-06-04
    死锁 互斥 Python
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作