文档章节

sync.Mutex 互斥锁

李琼涛
 李琼涛
发布于 10/14 18:29
字数 346
阅读 9
收藏 0

说明:

互斥锁用来保证在任一时刻,只能有一个例程访问某对象。
Mutex 的初始值为解锁状态。
Mutex 通常作为其它结构体的匿名字段使用,使该结构体具有 Lock 和 Unlock 方法。

Mutex 可以安全的在多个例程中并行使用。

sync.Mutex 源码解读 

// Locker 接口包装了基本的 Lock 和 UnLock 方法,用于加锁和解锁。
type Locker interface {
    Lock()
    Unlock()
}

// Lock 用于锁住 m,如果 m 已经被加锁,则 Lock 将被阻塞,直到 m 被解锁。
func (m *Mutex) Lock()

// Unlock 用于解锁 m,如果 m 未加锁,则该操作会引发 panic。
func (m *Mutex) Unlock()

demo

package main

import (
	"fmt"
	"sync"
	"time"
)

type Work struct {
	sync.Mutex
}

func main() {
	work := Work{}

	done := make(chan int)

	for i := 0; i < 10; i++ {
		go func(i int) {
			work.Lock()
			defer work.Unlock()

			time.Sleep(1 * time.Second)

			done <- i
		}(i)
	}

	for i := 0; i < 10; i++ {
		n := <-done
		fmt.Println(time.Now().Format("15:04:05"), n)
	}
}

output

liqiongtao:test liqiongtao$ go run main.go 
18:23:10 1
18:23:11 2
18:23:12 3
18:23:13 0
18:23:14 9
18:23:15 4
18:23:16 5
18:23:17 6
18:23:18 7
18:23:19 8

 

© 著作权归作者所有

李琼涛
粉丝 11
博文 141
码字总数 40605
作品 0
海淀
架构师
私信 提问
同步之sync.Mutex互斥锁

同步之sync.Mutex互斥锁 sync包中定义了Locker结构来代表锁。 并且定义了两个结构来实现Locker接口:Mutex 和 RWMutex。 我们可以用一个容量只有1的channel来保证最多只有一个goroutine在同一...

秋风醉了
2016/07/25
220
0
go 安全map 实现, 互斥锁和读写锁

互斥锁 其中Mutex为互斥锁,Lock()加锁,Unlock()解锁,使用Lock()加锁后,便不能再次对其进行加锁,直到利用Unlock()解锁对其解锁后,才能再次加锁.适用于读写不确定场景,即读写次数没有明...

solate
2016/07/27
333
0
Go基础系列:互斥锁Mutex和读写锁RWMutex用法详述(一)

ync.Mutex Go中使用sync.Mutex类型实现mutex(排他锁、互斥锁)。在源代码的sync/mutex.go文件中,有如下定义: 这没有任何非凡的地方。和mutex相关的所有事情都是通过sync.Mutex类型的两个方法...

echojson
04/18
9
0
《快学 Go 语言》第 13 课 —— 并发与安全

上一节我们提到并发编程不同的协程共享数据的方式除了通道之外还有就是共享变量。虽然 Go 语言官方推荐使用通道的方式来共享数据,但是通过变量来共享才是基础,因为通道在底层也是通过共享变...

技术小能手
2018/12/18
0
0
Golang sync.Cond源码分析

cond的主要作用就是获取锁之后,wait()方法会等待一个通知,来进行下一步锁释放等操作,以此控制锁合适释放,释放频率,适用于在并发环境下goroutine的等待和通知。 针对Golang 1.9的sync.Co...

梦朝思夕
2018/04/23
1K
0

没有更多内容

加载失败,请刷新页面

加载更多

电脑萌新向这看!荣耀笔记本装Win10系统攻略

     随着 Win10 系统功能的完善,越来越多的人想要为自己的电脑重装载一个 Win10 系统。但很多小伙伴对于重装系统也只是一知半解,不知道如何重装 win10 系统才是正确的。笔者认为,重装...

梅丽莎好
15分钟前
2
0
玩转阿里云 Terraform(四):Terraform 常用命令详解

通过前几篇文章的介绍,相信大家对Terraform已经有了大致的熟悉和了解,本文将从实践开始,向大家介绍Terraform的几个常见命令。 Terraform是一个面向客户端的工具,所以对所有资源的管理都是...

阿里云官方博客
17分钟前
3
0
GMAT数学满分目标 5条精华备考经验分享

GMAT数学对于大部分中国考生来说难度并不算太高。但伴随着近年来GMAT数学题难度逐渐提升的趋势,想要在GMAT数学部分保住高分满分的成绩以带动GMAT整体得分也变得越来越困难。下面小编就为大家...

bole6
22分钟前
3
0
elasticsearch 聚合之后获取桶的平均值avg_bucket或者stats_bucket

例子 GET /collect_data_store_goods_fact*/_search{ "query": { "match_all": {} }, "size": 0, "aggs": { "brand":{ "terms": { ......

之渊
28分钟前
3
0
一篇文章把你带入到JavaScript中的闭包与高级函数

在JavaScript中,函数是一等公民。JavaScript是一门面向对象的编程语言,但是同时也有很多函数式编程的特性,如Lambda表达式,闭包,高阶函数等,函数式编程时一种编程范式。 function dada(...

达达前端小酒馆
32分钟前
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部