Netty源码分析(七)—Recycler对象池分析

本文深入探讨了Netty中的Recycler对象池技术,分析了其如何通过ThreadLocal实现线程隔离和无锁线程安全。文章详细介绍了Recycler的结构,包括Handler、Stack和WeakOrderQueue组件,阐述了它们在对象创建、回收和复用中的作用。Recycler的get()方法用于获取对象,而recycle()或Handle的recycler()方法负责对象回收。Recycler的实现有效减少了内存分配和GC开销。
摘要由CSDN通过智能技术生成

Netty源码分析(七)—Recycler对象池分析

Netty中实现轻量级的对象池技术,用来减少因为频繁的对象创建销毁而触发的内存分配和GC带来的性能消耗;Recycler是netty轻量级对象池的具体实现;

Netty使用ThreadLocal变量实现对象池的线程隔离进而实现对象池的无锁线程安全,相当于每个线程都维护着各自的小线程池

个人主页:tuzhenyu’s page
原文地址:Netty源码分析(七)—Recycler对象池分析

(0) Recycler使用实例


public class RecyclerTest {
    static class WrapRecycler{

        private boolean tmp ;
        private final static Recycler<WrapRecycler> RECYCLER = new Recycler<WrapRecycler>() {
            @Override
            protected WrapRecycler newObject(Handle<WrapRecycler> handle) {
                return new WrapRecycler(handle);
            }
        };

        Recycler.Handle<WrapRecycler> handle;
        WrapRecycler(Recycler.Handle<WrapRecycler> handle){
            this.handle = handle;
            this.tmp = false;
        }

        static WrapRecycler getInstance(){
            return RECYCLER.get();
        }

        void recycle(){
            this.tmp = false;
            handle.recycle(this);
        }

        public boolean getTmp(){
            return tmp;
        }

        public void setTmp(boolean tmp){
            this.tmp = tmp;
        }
    }


    public static void main(String[] args) {
        WrapRecycler instance = WrapRecycler.getInstance();
        System.out.println(instance.hashCode());
        System.out.println(instance.getTmp());
        instance.setTmp(true);
        System.out.println(instance.getTmp());
        instance.recycle();
        instance = WrapRecycler.getInstance();
        System.out.println(instance.hashCode());
        System.out.println(instance.getTmp());
    }
}
  • 运行结果,两次获取的对象的hashcode哈希值相同说明是同一个对象

41359092

false

true

41359092

false

(1) Recycler类结构

  • Recycler是一个抽象类,在目标类中创建Recycler对象池实例时需要实现newObject(Handler handler)方法用来创建特定类的实例;

  • Recycler对象池内部是用一个对象数组维护对象池中的对象实例,对外提供统一的对象创建和回收接口:

    • Recycler#get方法 : 是获取对象池中对象的入口, 如果有可用对象,直接返回, 没有就调用newObject()方法创建一个.

    • Recycler#recycle方法: 是对象使用完毕后回收对象,只能回收当前线程创建的对象 现在已经标记@Deprecated不建议使用了, 建议使用Recycler.Handle#recycler方法,可以回收不是当前线程创建的对象, 复用性和性能更好了.

  • Recycler对象池的实现主要是通过三个核心组件:Handler,WeakOrderQueue和Stack

1. Handler组件

  • Handler组件主要用来对外提供一个recycle()对象回收接口

static <
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值