Guava限流器RateLimiter中mutexDoNotUseDirectly/锁的使用
文章目录 源码 疑惑 解惑 写在最后 源码 在阅读Guava限流器代码相关实现时,很多操作都需要加锁,比如在setRate方法中: public final void setRate ( double permitsPerSecond ) { checkArgument ( permitsPerSecond > 0.0 && ! Double . isNaN ( permitsPerSecond ) , "rate must be positive" ) ; synchronized ( mutex ( ) ) { doSetRate ( permitsPerSecond , stopwatch . readMicros ( ) ) ; } } 上述代码的重点即是 synchronized (mutex()){} ,用来在真正的修改速率(doSetRate)方法前加锁,避免出现并发问题。 接下来看 mutex() 方法: // Can't be initialized in the constructor because mocks don't call the constructor. @MonotonicNonNull private volatile Object mutexDoNotUseDirectly ; private Object mutex ( ) {