文章目录

go mutex是互斥锁,只有Lock和Unlock两个方法,在这两个方法之间的代码不能被多个goroutins同时调用到。

看代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
package main



import (

"fmt"

"sync"

"time"

)



var m *sync.Mutex



func main() {

m = new(sync.Mutex)



go lockPrint(1)

lockPrint(2)



time.Sleep(time.Second)



fmt.Printf("%s\n", "exit!")

}



func lockPrint(i int) {

println(i, "lock start")



m.Lock()



println(i, "in lock")

time.Sleep(3 * time.Second)



m.Unlock()

println(i, "unlock")

}

解读:

main函数里调用了两次lockPrint方法,这个方法中的println(i, “in lock”)这句话,由于是在Mutex的Lock和Unlock之间,所以在第一次调用未被Unlock之前是不可能再被执行的。

结果:

1
2
3
4
5
6
7
8
9
10
11
2 lock start

2 in lock

1 lock start

2 unlock

1 in lock

exit!

从上面可以看到:第二行2 in lock打印以后,1 lock start已经进入调用了,但是直到2 unlock后 1才能in lock。

保证了Lock和Unlock之间的代码不能被同时调用。

文章目录