二,dubbo的HashedWheelTimer类分析

 

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

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值