public boolean isAllowable() {
long now = System.currentTimeMillis();
if (now > lastResetTime + interval) {
token.set(rate);
lastResetTime = now;
}
int value = token.get();
boolean flag = false;
while (value > 0 && !flag) {
flag = token.compareAndSet(value, value - 1);
value = token.get();
}
return flag;
}
token是一个AtomicInteger类型。rate表示超过一定时间以后,给你放了多次调用机会,如果这段时间token次数用完,那么只能等时间超过interval。
对于comareAndSet的注释:
/**
* Atomically sets the value to the given updated value
* if the current value {@code ==} the expected value.
*
* @param expect the expected value
* @param update the new value
* @return {@code true} if successful. False return indicates that
* the actual value was not equal to the expected value.
*/
public final boolean compareAndSet(int expect, int update) {
return unsafe.compareAndSwapInt(this, valueOffset, expect, update);
}
也就是返回true说明你更新成功了,false你的这次更新失败了,那么也就是非阻塞、非重试的方法。
while (value > 0 && !flag 这个循环退出有两种情况:要不就是自己更新成功flag=true,要不就是别人把token用完了,导致token=0。