7
原子操作代替 lock
原子操作代替 lock
这个不对的,lim.monitorStarted怎么保障原子性?
atomic 可以保证最终的原子性,只启动一个 waitRedis monitorStarted 留着是因为在redis恢复期间大多数调用可以直接 fastfail,可以不需要锁
外部的monitorStarted没有保护,先要保证正确,然后才是精简和性能
func (lim *TokenLimiter) startMonitor() {
if lim.monitorStarted {
return
}
if atomic.CompareAndSwapUint32(&lim.redisAlive, 1, 0) {
lim.monitorStarted = true
go lim.waitForRedis()
}
}
最终正确性由 CompareAndSwapUint32 可以保证,其实 monitorStarted
这个变量都可以去掉了,保留的原因是这样连原子开销都可以不用了
if lim.monitorStarted 和 lim.monitorStarted = true 同时执行呢?