public HashedWheelTimer(
ThreadFactory threadFactory, // 线程工厂
long tickDuration, //多少时间动一次
TimeUnit unit, // 时间单位
int ticksPerWheel, //轮子个数
long maxPendingTimeouts //大于0生效 最大任务数
) {
dubbo里的时间轮 与 netty的时间轮类 有细微的差别,但基本算法都一样 ,比如队列用的不一样 。
懒启动策略 new出HashedWheelTimer线程并没有启动 ,首次调用 newTimeout方法才启动 。或者直接调用start()方法。
lock-free策略 使用cas保证线程安全 ,使用了AtomicIntegerFieldUpdater
public void start() {
switch (WORKER_STATE_UPDATER.get(this)) {
case WORKER_STATE_INIT:
if (WORKER_STATE_UPDATER.compareAndSet(this, WORKER_STATE_INIT, WORKER_STATE_STARTED)) {
workerThread.start();
}
break;
AtomicIntegerFieldUpdater是JUC里面的类,原理是利用安全的反射进行原子操作,来获取实例的本身的属性。有比AtomicInteger更好的性能和更低得内存占用
内部结构跟hashmap很相似 是数组加链表的结构
HashedWheelBucket[] ,hashedWheelBucket是一个链表 ,里面的元素是HashedWheelTimeout
参考
https://zhuanlan.zhihu.com/p/32906730