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 。 ]java
对于 sync.Mutex 或是 sync.RWMutex 类型的变量 mutex 来讲,假定 n < m,对于 mutex.Unlock() 的第 n 次调用在 mutex.Lock() 的第 m 次调用返回以前发生。[ 对于一个 mutex 来讲,lock 一下,第二次 lock 会阻塞,只有 unlock 一下才能够继续 lock,就是这个意思。然而 unlock 一个没有 lock 的 mutex 会怎么样呢?error ! ]线程
其实关键的就一点code
每一次lock 以后是为了等待unclock的返回值,那么怎么确保unlock操做的以前的值返回呢,go种定义了 每一次lock 必须是在上一次unlock以后才会发生。因此这个程序是这么解读的:string
1.调用一次lock 2.gorou里面对a赋值,进行写操做,此时unlock操做与写操做在同一个“线程”里面,而且unlock在写以后。 3.调用l.lock()确保,此时必须的等到unlock完成。即lock发生在UNclock以后,更发生在赋值以后 4.第二个lock发生在print以前,因此你懂得。