go语言类似Java JUC包也提供了一些列用于多线程之间进行同步的措施,比如低级的同步措施有 锁、CAS、原子变量操作类。相比Java来说go提供了独特的基于通道的同步措施。本节我们先来看看go中互斥锁
互斥锁是独占锁,同时只有一个线程可以获取该锁,其他线程则会被阻塞挂起,等获取锁的线程释放锁后,阻塞的线程中的一个才可以被唤醒并获取锁。
本节我们使用独占锁来实现一个线程安全的计数器:
package main
import (
"fmt"
"sync"
)
var (
counter int//计数器
wg sync.WaitGroup//信号量
mutex sync.Mutex//互斥锁
)
func main() {
//1.两个信号量
wg.Add(2)
//2.开启两个线程
go incCounter()
go incCounter()
//3.等待子线程结束
wg.Wait()
fmt.Println(counter)
}
func incCounter() {
defer wg.Done()
//2.1.获取锁
mutex.Lock()
//2.2.计数加1
counter++
//2.3.释放独占锁
mutex.Unlock()
}
go中互斥锁是独占锁,并且是不可重入锁,同一个线程并不可获取同一个锁多次。