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语言并发与并行学习笔记(一)

如果不是我对真正并行的线程的追求,就不会认识到Go有多么的迷人。 Go语言从语言层面上就支持了并发,这与其他语言大不一样,不像以前我们要用Thread库 来新建线程,还要用线程安全的队列库来共享...
  • kjfcpua
  • kjfcpua
  • 2014年01月14日 16:09
  • 19863

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

package main import ( "fmt" "sync" "time" ) var l sync.RWMutex var a string = "1" func f() { ...

Go语言net/http 解读.

Http包提供实现HTTP客户端和服务端的方法与函数。 Get、Head、Post、PostForm配合使用实现HTTP请求: resp, err := http.Get("http://exam...

go语言学习之gzip包解读

打开浏览器浏览网页时,我们可以看到各种各样的文字、图片、视频等等各式各样的信息。那么浏览器是怎样和服务器交互这些信息的呢?通过分析不难发现,这些信息往往要经过统一编码之后,才进行传递。今天,我们来通过...

go语言 nsq源码解读三 nsqlookupd源码nsqlookupd.go

转自:http://www.baiyuxiong.com/?p=891 从本节开始,将逐步阅读nsq各模块的代码。 读一份代码,我的思路一般是: 1、了解用法,知道了怎么...

Go语言·云动力中文版(带目录)pdf

  • 2017年11月24日 11:03
  • 18.73MB
  • 下载

Go语言实战

  • 2017年12月08日 13:45
  • 9.28MB
  • 下载

go语言切片slice的线程协程安全问题

go语言切片slice的线程协程安全问题

Go语言实战

  • 2017年11月21日 12:20
  • 8.7MB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Go语言锁的解读
举报原因:
原因补充:

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