Go并发编程之美-互斥锁

Posted 技术原始积累

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Go并发编程之美-互斥锁相关的知识,希望对你有一定的参考价值。

一、前言

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

二、互斥锁

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

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

 
   
   
 
  1. package main


  2. import (

  3.    "fmt"

  4.    "sync"

  5. )


  6. var (

  7.    counter int//计数器

  8.    wg      sync.WaitGroup//信号量

  9.    mutex   sync.Mutex//互斥锁

  10. )


  11. func main() {

  12.    //1.两个信号量

  13.    wg.Add(2)


  14.    //2.开启两个线程

  15.    go incCounter()

  16.    go incCounter()


  17.    //3.等待子线程结束

  18.    wg.Wait()

  19.    fmt.Println(counter)

  20. }


  21. func incCounter() {

  22.    defer wg.Done()


  23.    //2.1.获取锁

  24.    mutex.Lock()


  25.    //2.2.计数加1

  26.    counter++


  27.    //2.3.释放独占锁

  28.    mutex.Unlock()

  29. }

  • 在go中使用 sync.Mutex 就可以获取一个开箱即用的互斥锁

  • counter是一个变量,这里用来存放计数

  • wg用来实现主线程等待子线程执行完毕,代码(2)设置信号为2,因为本例子里面开启了两个字线程

  • 代码(2)开启了两个子线程,线程内首先获取互斥锁,然后累加计数,然后释放锁,最后递减信号量

  • 代码(3)等待子线程执行完毕后返回,然后打印计数

三、总结

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


以上是关于Go并发编程之美-互斥锁的主要内容,如果未能解决你的问题,请参考以下文章

Go并发编程之传统同步—互斥锁

Go36-26-互斥锁与读写锁

go语言学习笔记 — 进阶 — 并发编程:互斥锁(sync.Mutex)—— 保证同时只有一个goroutine可以访问共享资源

go语言学习笔记 — 进阶 — 并发编程(10):读写互斥锁(sync.RWMutex) —— 在读比写多的环境下,比互斥锁更高效

Go语言自学系列 | golang并发编程之Mutex互斥锁实现同步

Go 并发编程:锁SelectContext定时器