private void rescaleIfNeeded() {
   final long now = clock.getTick();
   final long next = nextScaleTime.get();
   if (now >= next) {
     rescale(now, next);
   }
 }
 /**
  * Creates a new {@link ExponentiallyDecayingReservoir}.
  *
  * @param size the number of samples to keep in the sampling reservoir
  * @param alpha the exponential decay factor; the higher this is, the more biased the reservoir
  *     will be towards newer values
  * @param clock the clock used to timestamp samples and track rescaling
  */
 public ExponentiallyDecayingReservoir(int size, double alpha, Clock clock) {
   this.values = new ConcurrentSkipListMap<Double, WeightedSample>();
   this.lock = new ReentrantReadWriteLock();
   this.alpha = alpha;
   this.size = size;
   this.clock = clock;
   this.count = new AtomicLong(0);
   this.startTime = currentTimeInSeconds();
   this.nextScaleTime = new AtomicLong(clock.getTick() + RESCALE_THRESHOLD);
 }