Go语言锁的解读

var l sync.Mutex
var a string

func f() {
	a = "hello, world"
	l.Unlock()
}

func main() {
	l.Lock()
	go f()
	l.Lock()
	print(a)
}

sync 包中实现了两个关于锁的数据类型,sync.Mutex 和 sync.RWMutex。[ 互斥锁 mutex 是独占型,只能 lock 一次, unlock 一次,然后才能继续 lock 否则阻塞。 读写互斥锁 reader-writer mutex 是所有的 reader 共享一把锁或是一个 writer 独占一个锁, 如果一个 reader lock 到锁了, 其他的 reader 还可以 lock 但是 writer 不能 lock 。 ]

对于 sync.Mutex 或是 sync.RWMutex 类型的变量 mutex 来说,假定 n < m,对于 mutex.Unlock() 的第 n 次调用在 mutex.Lock() 的第 m 次调用返回之前发生。[ 对于一个 mutex 来说,lock 一下,第二次 lock 会阻塞,只有 unlock 一下才可以继续 lock,就是这个意思。然而 unlock 一个没有 lock 的 mutex 会怎么样呢?error ! ]

其实关键的就一点

每一次lock 之后是为了等待unclock的返回值,那么怎么确保unlock操作的之前的值返回呢,go种定义了 每一次lock 必须是在上一次unlock之后才会发生。所以这个程序是这么解读的:

1.调用一次lock
2.gorou里面对a赋值,进行写操作,此时unlock操作与写操作在同一个“线程”里面,并且unlock在写之后。
3.调用l.lock()确保,此时必须的等到unlock完成。即lock发生在UNclock之后,更发生在赋值之后
4.第二个lock发生在print之前,所以你懂得。
时间: 2024-10-04 15:41:48

Go语言锁的解读的相关文章

c语言声明的解读、typedef与define的区别

读声明: 1.最先从左往右找到最左边的标识符. 2.查看标识符右边的下一个符号.若是方括号,则表示到“...的数组”. 3.如果是一个左圆括号.到右括号为止的内容表示“返回...的函数”. 4.再往右找,如果左边的符号是一个左括号, 这个左括号把已处理的部分声明组合在一起,直到遇见对应的右括号,然后从第二步重新开始. 5.如果是*,表示“指向...的指针”: 如果是const,表示“只读”: 如果是volatile,表示“volatile”: 6.剩下的符号可一并阅读. 练习例子:char *

Go语言之Go语言锁机制

Go 语言锁机制 Go 语言互斥锁 Go语言的sync包中实现了两种锁 Mutex (互斥锁)和 RWMutex (读写锁),其中 RWMutex 是基于 Mutex 实现的,只读锁的实现使用类似引用计数器的功能. 互斥锁 Mutex 是互斥锁,有 Lock()加锁.Unlock()解锁两个方法,使用Lock()加锁后,便不能再次对其进行加锁,直到利用 Unlock()解锁对其解锁后才能再次加锁.适用于读写不确定场景,即读写次数没有明显的区别,并且只允许只有一个读或者写的场景,所以该锁也叫做全局

ReentrantLock获取锁方式解读(转)

原文地址:http://www.zhihu.com/question/36771163 (一) lock()方法获取锁.如果该锁没有被另一个线程保持,则获取该锁并立即返回,将锁的保持计数设置为 1.如果当前线程已经保持该锁,则将保持计数加 1,并且该方法立即返回.如果该锁被另一个线程保持,则出于线程调度的目的,禁用当前线程,并且在获得锁之前,该线程将一直处于休眠状态,此时锁保持计数被设置为 1. (二) lockInterruptibly()方法获取锁.1) 如果当前线程未被中断,则获取锁.2)

悲观锁和乐观锁的解读

悲观锁(Pessimistic Lock) 当我们要对一个数据库中的一条数据进行修改的时候,为了避免同时被其他人修改,最好的办法就是直接对该数据进行加锁以防止并发.这种借助数据库锁机制,在修改数据之前先锁定,再修改的方式被称之为悲观并发控制(是因为这是一种对数据的修改抱有悲观态度的并发控制方式.我们一般认为数据被并发修改的概率比较大,所以需要在修改之前先加锁.又名“悲观锁”,Pessimistic Concurrency Control,缩写“PCC”). 悲观锁主要是共享锁或排他锁 共享锁又称

Go语言net/http 解读.

Http包提供实现HTTP客户端和服务端的方法与函数. Get.Head.Post.PostForm配合使用实现HTTP请求: resp, err := http.Get("http://example.com/") resp, err := http.Post("http://example.com/upload", "image/jpeg", &buf) resp, err := http.PostForm("http://

mysql行锁和表锁

mysql innodb支持行锁和表锁,但是MyIsam只支持表锁.现在我们说说mysql innodb的行锁和 有如下表id为主键 为了出现演示效果,我们将mysql的autocommit设置为0 打开两个mysql命令行窗口,都设置为autocommit为0 窗口1: 窗口2: 这时候我们发现窗口2一直在阻塞,当我们在窗口1中commit后,发现窗口2有输出了. 上面我们更新不是同一个记录,为什么事物1没提交时,事物2一直等待了.因为这个时候用的是表锁. 现在我们给name字段加上索引,效果

go语言 http学习

net/http库学习 概念 处理器 处理器:拥有ServeHTTP方法的接口(任何类型) 签名:ServeHTTP(http.ResponseWriter, *http.Request) ResponseWriter接口 指向Request结构的指针 ServeMux结构(拥有ServeHTTP方法,如上签名) Handler结构 多路复用器 DefaultServeMux(ServeMux结构的实例) 处理器函数 与处理器有相同行为的函数 与ServeHTTP方法有相同的签名 ServeMu

每天遇到的零散知识汇聚

3.14 https://zhidao.baidu.com/question/1894472665628866420.html 3.15 go语言锁 go语言驱动msyql golang判断文件或文件夹是否存在 go-import下划线的作用 golang源代码换行问题 golangerror 进一步认识golang中的并发 Go语言如何并发超时处理详解 golang超时控制

孩子爱玩手机,该怪谁?

“手机”,现代社会的天使与魔鬼,大人.小孩无一幸免. 据最新预测数据,截止2020年,世界上90%的6岁以上人将人手一部手机,而且这还仅仅是保守估计.虽然不是所有人都用智能手机,但它的比例在增加. 每个六岁以上的孩子人手一部手机,这是否会导致某种负面影响?现在很多小孩都能非常娴熟得玩iPad.虽然现在还没有强有力的数据证明这会影响大脑,但变化会发生在一代人与一代人之间. 一份来自加州大学洛杉矶分校的调查员表明:在五天的时间内不接触手机.平板.电脑等数码产品的六年级学生,在非语言类线索解读以及人类