Go并发编程之美(三)、互斥锁

本文介绍Go语言中互斥锁的使用,通过实例演示如何利用互斥锁实现线程安全的计数器,避免多线程环境下的数据竞争。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

go并发编程目录

一、前言

go语言类似Java JUC包也提供了一些列用于多线程之间进行同步的措施,比如低级的同步措施有 锁、CAS、原子变量操作类。相比Java来说go提供了独特的基于通道的同步措施。本节我们先来看看go中互斥锁.

二、互斥锁

互斥锁是独占锁,同时只有一个线程可以获取该锁,其他线程则会被阻塞挂起,等获取锁的线程释放锁后,阻塞的线程中的一个才可以被唤醒并获取锁。

本节我们使用独占锁来实现一个线程安全的计数器:

package main

import (
    "fmt"
    "sync"
)

var (
    counter int//计数器
    wg      sync.WaitGroup//信号量
    mutex   sync.Mutex//互斥锁
)

func main() {
    //1.两个信号量
    wg.Add(2)

    //2.开启两个线程
    go incCounter()
    go incCounter()

    //3.等待子线程结束
    wg.Wait()
    fmt.Println(counter)
}

func incCounter() {
    defer wg.Done()

    //2.1.获取锁
    mutex.Lock()

    //2.2.计数加1
    counter++
    
    //2.3.释放独占锁
    mutex.Unlock()
}


  • 在go中使用 sync.Mutex 就可以获取一个开箱即用的互斥锁
  • counter是一个变量,这里用来存放计数
  • wg用来实现主线程等待子线程执行完毕,代码(2)设置信号为2,因为本例子里面开启了两个字线程
  • 代码(2)开启了两个子线程,线程内首先获取互斥锁,然后累加计数,然后释放锁,最后递减信号量
  • 代码(3)等待子线程执行完毕后返回,然后打印计数

三、总结

go中互斥锁是独占锁,并且是不可重入锁,同一个线程并不可获取同一个锁多次。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值