Golang 互斥锁与读写锁
临界区 (Critical section) 在并发编程中,对共享资源的并发访问会导致意外或错误的行为,因此需要对访问共享资源的程序部分进行保护,以避免并发访问。这个被保护的部分就是关键部分或关键区域。它不能被一个以上的进程同时执行。通常情况下,关键部分访问共享资源,如数据结构、外围设备或网络连接,在多个并发访问的情况下,这些资源将无法正常运行。 如下图,在互斥(mutex)的情况下,一个线程在需要访问共享资源时,通过使用锁的技术封锁一个关键部分,而其他线程必须等待轮到自己进入该部分。这可以防止两个或更多的线程共享同一内存空间并想访问一个共同的资源时发生冲突。 互斥锁 互斥锁是一种常用的控制共享资源访问的方法,它能够保证同时只有一个goroutine可以访问共享资源。 Go语言中使用sync包的Mutex类型来实现互斥锁。 使用互斥锁能够保证同一时间有且只有一个goroutine进入临界区,其他的goroutine则在等待锁;当互斥锁释放后,等待的goroutine才可以获取锁进入临界区,多个goroutine同时等待一个锁时,唤醒的策略是随机的。 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 package main import ( "fmt" "sync" ) var num int64 var wg sync.WaitGroup var mux sync.Mutex func main() { wg.Add(2) go add() go add() wg.Wait() fmt.Println(num) // output: 10000 } func add() { for idx := 0; idx < 5000; idx++ { mux....