首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Go并发编程之美-互斥锁

Go并发编程之美-互斥锁

原创
作者头像
加多
发布2019-02-15 19:24:29
3450
发布2019-02-15 19:24:29
举报

一、前言

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

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、前言
  • 二、互斥锁
  • 三、总结
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档