转自:http://studygolang.com/articles/3026

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

看代码:

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之前是不可能再被执行的。

结果:
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之间的代码不能被同时调用。

相关文章:

  • 2021-08-28
  • 2022-12-23
  • 2022-12-23
  • 2022-01-07
  • 2021-09-11
  • 2022-02-01
  • 2022-12-23
猜你喜欢
  • 2022-12-23
  • 2022-12-23
  • 2022-01-07
  • 2021-10-12
  • 2022-12-23
  • 2021-05-10
相关资源
相似解决方案