《7天学会Go并发编程》第三天 go的Mutex使用

😯go语言并发编程中,简单经典好用的就是Mutex,也就是go语言中的互斥,适用于比较初阶的go并发编程。

🚗🚗🚗🚗这边文章里面会介绍Mutex的两个经典使用方法。

  系列文章目录

《7天学会Go并发编程》第一天 go并发实战初窥门径_大锤爱编程的博客-CSDN博客

《7天学会Go并发编程》の第二天 写一个简单的Go并发程序以及Goroutine的使用_大锤爱编程的博客-CSDN博客

《7天学会Go并发编程》第三天 go的Mutex使用_大锤爱编程的博客-CSDN博客

《7天学会Go并发编程》第四天 sync.Once和sync.WaitGroup学习应用实践_大锤爱编程的博客-CSDN博客

《7天学会Go并发编程》第五天 go语言Context的应用和实现 go实现超时判断_大锤爱编程的博客-CSDN博客

《7天学会Go并发编程》第六天 go语言Sync.cond的应用和实现 go实现多线程联合执行_大锤爱编程的博客-CSDN博客

《7天学会Go并发编程》第7天 go语言并发编程Atomic原子实战操作含ABA问题_大锤爱编程的博客-CSDN博客

目录

一、Mutex是什么

二、🍻go语言Mutex经典编程案例

2.1🍺🍺🍺 原生态并发计数

2.2 🍭🍭🍭使用带锁结构体实现并发计数

三、🍏🍏🍏总结


一、Mutex是什么

Mutex是go语言当中的互斥锁,作用是用来给临界区的数据加锁,保证一次只有一个goroutline可以对临界区资源访问修改。避免发生冲突。

这样:

二、🍻go语言Mutex经典编程案例

经典编程案例有两个:1、直接使用Mutex对临界区资源修改

2.1🍺🍺🍺 原生态并发计数

  并发开启100个线程进行计数,使用mutex对关键代码进行加锁,确保每次只有一个线程对这个关键变量进行修改,避免多个线程同时这个关键代码进行操作。

func MutextExer() {
	initValue := 0
	group := sync.WaitGroup{}
	mutex := sync.Mutex{}
	for i := 0; i < 100; i++ {
		group.Add(1)
		go func(value *int) {
			defer group.Done()
			mutex.Lock()
			for i := 0; i < 1000; i++ {
				*value++
			}
			mutex.Unlock()
		}(&initValue)
	}
	group.Wait()
	fmt.Printf("The count value is %d", initValue)
}

代码对应结果:

2.2 🍭🍭🍭使用带锁结构体实现并发计数

        加锁,使用mutex解决线程并发问题 。加锁通俗的说就是对资源上锁,拿到钥匙的人才能访问,控制住了钥匙,⚓️就能控制住访问顺序。

        定义一个该结构体的接口,实现一个线程安全的参数累加。

结构体定义:

type count struct {
	lock sync.Mutex
	value int
}
//结构体对应的结构方法
func (receiver *count) countOne()  {
	receiver.lock.Lock()
	defer receiver.lock.Unlock()
	receiver.value++
}

下面实现累加对应实现:

带锁结构体的应用相对来说比较简单,实现一个对应的结构体带锁函数。带锁结构体初始化后,直接调用对应的线程安全函数就可以实现。

func StructMutex() {
   c := count{
      lock:  sync.Mutex{},
      value: 0,
   }
   group := sync.WaitGroup{}
   for i := 0; i < 100; i++ {
      group.Add(1)
      go func(count2 *count) {
         defer group.Done()
         for i := 0; i < 1000; i++ {
            count2.countOne()
         }
      }(&c)
   }
   group.Wait()
   fmt.Printf("The count value is %d", c.value)
}

代码对应结果:

三、🍏🍏🍏总结

        Mutex在go语言并发编程中是一个比较经典和关键的sync结构体。基本的使用方法如上所示:1、直接使用mutex包裹对应需要并发执行的代码  2、定义带锁结构体,实现对应的线程安全方法。结构体初始化后,直接调用对应的线程安全方法。💪🏻⛽️~

🧧🧧🧧感谢诸位大佬的阅读,点个关注,收藏一下呗~

    

  • 11
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

大锤爱编程

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值