编程语言
首页 > 编程语言> > Netty的对象池实现——Recycler源码浅析

Netty的对象池实现——Recycler源码浅析

作者:互联网

Netty中带有"Pooled"前缀的buffer,创建出来后是可以被循环利用的,以达到一个对象池的效果,避免了频繁地GC。而这个对象池的核心,就是Recycler。

Recycler

Recycler是一个抽象类,在Netty中有一个匿名的实现类:

private static final class RecyclerObjectPool<T> extends ObjectPool<T> {
    private final Recycler<T> recycler;

    RecyclerObjectPool(final ObjectCreator<T> creator) {
         recycler = new Recycler<T>() {
            @Override
            protected T newObject(Handle<T> handle) {
                return creator.newObject(handle);
            }
        };
    }

    @Override
    public T get() {
        return recycler.get();
    }
}

可以看到,只有一个抽象方法,即创建对象的方法newObject,Recycler不负责创建对象,只负责管理创建的对象。

Recycler的属性可以分为以下几类:

Recycler的核心方法有两个:

从get的方法中我们看到一个熟悉的对象:Stack(栈)。但此栈非java.util中的Stack,而是Recycler的一个内部类,但还是栈的数据结构。get方法的逻辑很简单:从threadLocal中取一个与当前线程对应的stack,然后从stack中pop出一个类型为DefaultHandler的handler,如果handler为空,就生成一个handler,并且将生成的对象保存到handler.value中。从这短短几行代码中我们可以确定几个事实:

接下来我们看看Stack是怎样实现的,起到了什么作用

Stack

Stack的属性中比较重要的有:

既然是栈,那么一定有两个操作:

WeakOrderQueue

WeakOrderQueue有两个内部类:

介绍完这两个内部类,来看看WeakOrderQueue的属性:

看到这里我想大家都明白了,我们被"Queue"这个名字欺骗了,实际上WeakOrderQueue就是一个链表,通过next指针串起来。至于head和link的作用,我们需要回到上面分析Stack时跳过的两个方法:WeakOrderQueue的add和Stack的scavenge方法

总结

我知道很多人看到这里还是对总体的结构没什么概念,这里我画了一张图,可以帮助理解Recycler即期内部类之间的关系:

Recycler的实现有许多巧妙之处:

 

标签:Netty,head,return,stack,源码,Link,Stack,WeakOrderQueue,浅析
来源: https://www.cnblogs.com/cedriccheng/p/14397148.html