importjava.util.ArrayList;importjava.util.List;importjava.util.Random;importjava.util.concurrent.CountDownLatch;importjava.util.concurrent.atomic.LongAdder;importjava.util.concurrent.locks.ReentrantLock;public classRollingNumber {private intbucketNum;/*** 槽组*/
privateBucket[] buckets;/*** 时间片*/
private longbucketTimeSlice;/*** 目标槽位下标*/
private volatileInteger targetBucketPosition;/*** 临界跨槽时的时间点*/
private volatile longlastPassTimeCloseToTargetBucket;/*** 刷新槽位时使用的锁*/
privateReentrantLock enterNextBucketLock;/*** 固定窗口的最大qps*/
private volatile longmaxSummary;privateRollingNumber() {this(60, 1000);
}private RollingNumber(int bucketNum, intmillerSecond) {this.bucketNum =bucketNum;
buckets= newBucket[bucketNum];for (int i = 0; i < bucketNum; i++) {
buckets[i]= newBucket();
}this.bucketTimeSlice =millerSecond;
enterNextBuck