🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
* 互斥锁不保证原子性是指(在mutex.Lock() 和 number++ 之间的间隙有可能去执行其他线程)? 互斥锁是防君子不防小人。 君子——守规矩,先开锁再进门。 小人——不守规矩,无视锁的存在。 ~~~ package main import ( "time" "fmt" "sync" ) var mutex sync.Mutex //原子性 //被互斥锁隔离的代码块只能串行执行 //第一个 goroutine 在 sleep 的过程中实际上已经中断了,第二个 goroutine 被调度插了进来,仅仅因为互斥锁的作用,它卡在那里了 //如果第二个 goroutine 没有请求互斥锁的话,实际上第一个 goroutine 的【原子性】就被打破了。 func main() { number := 1 go func() { mutex.Lock() number++ time.Sleep(time.Second * 2) number *= 2 mutex.Unlock() }() time.Sleep(time.Second) go func() { //mutex.Lock() number++ //mutex.Unlock() }() time.Sleep(time.Second * 3) fmt.Println(number) } ~~~