Netty源码解析(7):两大性能优化工具类

1、FastThreadLocal

 * @author: yangchun
 * @description:
 * @date: Created in 2020-04-23 12:53
 */
public class FastThreadLocalTest {
    private static FastThreadLocal<Object> threadLocal = new FastThreadLocal<Object>(){
        @Override
        protected Object initialValue(){
            return new Object();
        }
    };

    public static void main(String[] args) {
        new Thread(()->{
            Object object = threadLocal.get();
            System.out.println(object);
        }).start();
        new Thread(()->{
            Object object = threadLocal.get();
            System.out.println(object);
        }).start();
    }
}

  1、实现机制

    创建,首先复制index,每个threadLocal都有一个index,作为一个身份标识。

    get实现,获取ThreadLocalMap,通过index获取对象,如果没有就调用初始化。如果是FastThreadLocalMap通过线程里面维护的ThreadLocalMap对象,如果不是就需要通过ThreadLocal方式来获取。

    set方法实现,获取线程的ThreadLocalMap,直接通过索引set对象,remove对象

2、Recycler轻量级对象池

  

package com.xiaofeiyang;

import io.netty.util.Recycler;

/**
 * @author: yangchun
 * @description:
 * @date: Created in 2020-04-23 13:24
 */
public class RecycleTest {
    private static final Recycler<User> recycler = new Recycler<User>() {
        @Override
        protected User newObject(Handle<User> handle) {
            return new User(handle);
        }
    };
    private static class User{
        private final Recycler.Handle<User> handle;
        public User(Recycler.Handle<User> handle){
            this.handle = handle;
        }
        public void recycle(){
            handle.recycle(this);
        }
    }

    public static void main(String[] args) {
        User user = recycler.get();
        user.recycle();
        User user1 =  recycler.get()
    }
}

  1、PooledDirectByteByf,里面利用recycler充分回收对象。

  2、Recycle的创建

    每一个里面有一个线程Thread,Handle链表。ratioMask控制回收比例,maxCapacity最大大小,maxDelayedQueues。head,prev和cursor和availableSharedCapacity

  3、获取对象

    获取stack

    从stack弹出对象

    将对象和handle以及stack绑定,方便进行回收。

  4、回收对象到recycler

    同线程回收对象

    异线程回收对象

    压栈,判断是否是同一线程,如果是直接放入栈中。

    创建weakOrderQueue

posted on 2020-04-23 14:27  清浊  阅读(310)  评论(0)    收藏  举报