专栏首页Java编程技术Go并发编程之美-互斥锁

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中互斥锁是独占锁,并且是不可重入锁,同一个线程并不可获取同一个锁多次。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Go并发编程之美-互斥锁

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

    加多
  • Java 并发编程之美-线程相关的基础知识-chat

    借用 Java 并发编程实践中的话;编写正确的程序并不容易,而编写正常的并发程序就更难了;相比于顺序执行的情况,多线程的线程安全问题是微妙而且出乎意料的,因为在...

    加多
  • Dubbo剖析-线程模型

    Dubbo默认的底层网络通讯是使用Netty来做的,在服务提供方NettyServer使用两级线程池,其中EventLoopGroup(boss)主要用来接受客...

    加多
  • Go并发编程之美-互斥锁

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

    加多
  • MongoDB网络传输处理源码实现及性能调优-体验内核性能极致设计

    开源MongoDB代码规模数百万行,本篇文章内容主要分析MongoDB网络传输模块内部实现及其性能调优方法,学习网络IO处理流程,体验不同工作线程模型性能极致设...

    MongoDB中文社区
  • 菜鸟的进阶之路:了解使用多线程

    关于多进程和多线程,教科书上最经典的一句话是“进程是资源分配的最小单位,线程是CPU调度的最小单位”,一般来说进程是独立的而同一进程中的线程是共享的,但是开一个...

    乱敲代码
  • 菜鸟的进阶之路:了解使用多线程

    关于多进程和多线程,教科书上最经典的一句话是“进程是资源分配的最小单位,线程是CPU调度的最小单位”,一般来说进程是独立的而同一进程中的线程是共享的,但是开一个...

    码农小胖哥
  • 关于浏览器环境JS单线程及小程序双线程架构的一点思考

    1.通过了解浏览器线程的一些知识我们知道浏览器进程中GUI线程是与JS引擎线程互斥的。 2.小程序的架构是JsCore执行js逻辑代码+webview页面渲染...

    薛定喵君
  • C# 基础知识系列- 12 任务和多线程

    照例一份前言,在介绍任务和多线程之前,先介绍一下异步和同步的概念。我们之间介绍的知识点都是在同步执行,所谓的同步就是一行代码一行代码的执行,就像是我们日常乘坐地...

    程序员小高
  • 4种Java线程池用法以及线程池的作用和优点,你都知道了没?

    2、如果用户量比较大,导致占用过多的资源,可能会导致我们的服务由于资源不足而宕机;

    程序员追风

扫码关注云+社区

领取腾讯云代金券