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
浙公网安备 33010602011771号