Go语言锁的解读

原创 2015年07月10日 14:13:52
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
2
3
4
1.调用一次lock
2.gorou里面对a赋值,进行写操作,此时unlock操作与写操作在同一个“线程”里面,并且unlock在写之后。
3.调用l.lock()确保,此时必须的等到unlock完成。即lock发生在UNclock之后,更发生在赋值之后
4.第二个lock发生在print之前,所以你懂得。

一个小实例告诉你GO锁的使用.

package main import ( "fmt" "sync" "time" ) var l sync.RWMutex var a string = "1" func f() { ...
  • fyxichen
  • fyxichen
  • 2015年10月28日 11:28
  • 1713

golang基础-互斥锁、读写锁

互斥锁其中Mutex为互斥锁,Lock()加锁,Unlock()解锁,使用Lock()加锁后,便不能再次对其进行加锁,直到利用Unlock()解锁对其解锁后,才能再次加锁.适用于读写不确定场景,即读写...
  • u013210620
  • u013210620
  • 2017年10月26日 20:00
  • 330

Golang同步:条件变量和锁组合使用

条件变量的作用并不是保证在同一时刻仅有一个线程访问某一个共享数据,而是在对应的共享数据的状态发生变化时,通知其他因此而被阻塞的线程。条件变量与互斥量组合使用 互斥量为共享数据的访问提供互斥支持 条件变...
  • grassroots2011
  • grassroots2011
  • 2015年11月26日 22:28
  • 2857

golang sync mutex 互斥锁

golang的多线程固然好用,但是有时候需要对数据进行上锁,防止数据被其它线程更改。那么sync包下的Mutex非常好用。 Mutex是一个互斥锁。可以作为struct的一部分,这样这个stru...
  • u011511092
  • u011511092
  • 2014年05月07日 13:44
  • 4518

golang中的锁

一、互斥锁 互斥锁是传统的并发程序对共享资源进行访问控制的主要手段。它由标准库代码包sync中的Mutex结构体类型代表。sync.Mutex类型(确切地说,是*sync.Mutex类型)只有两个公...
  • fy1236253
  • fy1236253
  • 2016年10月19日 17:06
  • 132

[Golang]golang中自动锁的实现

golang作为原生支持多线程的语言,为了实现线程安全的package,经常需要对全局变量自动加锁,以便安全的访问全局变量。 废话不多说,直接上代码: package main impor...
  • vipally
  • vipally
  • 2014年11月09日 19:55
  • 523

我为什么选择使用Go语言?

谢孟军:EGO会员、GopherChina组织者、《Go Web编程》一书的作者,专注Golang技术架构。本文来自EGO会员群分享,入群方式见文末   在这里我主要想和大家分享一些Go和我个人...
  • csdn265
  • csdn265
  • 2016年11月23日 21:40
  • 1533

Go语言的前世今生

今天跟大家分享一下Go语言的发展历程。谷歌工程师的20%时间谷歌的“20%时间”工作方式,允许工程师拿出20%的时间来研究自己喜欢的项目。语音服务Google Now、谷歌新闻Google News、...
  • wangshubo1989
  • wangshubo1989
  • 2017年02月15日 14:44
  • 15819

golang实践-如何优先使用通道替换锁

背景这段时间,重构了一些服务的基础工具库,主要是解耦pub-sub改为异步系统[eventbus],简单调整了定时器[clock]。本来以为已经大幅简化了业务没问题了,结果5月份,其中一个服务因为广播...
  • qq_26981997
  • qq_26981997
  • 2017年06月14日 22:16
  • 544

golang 中 锁的错误的用法会导致死锁。

package main import ( "sync" "time" . "github.com/soekchl/myUtils" ) var mux sync.RWMutex fun...
  • soekchl521
  • soekchl521
  • 2017年07月25日 11:07
  • 567
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Go语言锁的解读
举报原因:
原因补充:

(最多只允许输入30个字)