1、 SegmentPool源码解析
/**
* 一个单例的线程安全的segment对象池,避免频繁创建和回收对象带来的性能消耗
*/
final class SegmentPool {
//SegmentPool最大容量 64KB
static final long MAX_SIZE = 64 * 1024; // 64 KiB.
//由Segment组成的双向链表的第一个元素
static @Nullable Segment next;
//对象池当前总大小
static long byteCount;
private SegmentPool() {
}
/**如果对象池中有缓存,把next指向的segment从链表中摘出来,返回给调用处使用,next指向segment的下一个元素
* 如果对象池是空的,则new 一个Segment返回
*/
static Segment take() {
synchronized (SegmentPool.class) {
if (next != null) {
Segment result = next;
next = result.next;
result.next = null;
byteCount -= Segment.SIZE;
return result;
}
}
return new Segment();//对象池是空的,new 一个Segment返回
}
/**
* 对象回收放回对象池链表中
*/
static void recycle(Segment segment) {
//回收的segment.prev/next非空,抛出非法参数异常
if (segment.next != null || segment.prev != null) throw new IllegalArgumentException();
//如果与其他segment共享标识位,则不可回收
if (segment.shared) return;
synchronized (SegmentPool.class) {//全局上锁
if (byteCount + Segment.SIZE > MAX_SIZE) return;//对象池满了,不再添加
byteCount += Segment.SIZE;//更新对象池当前大小
segment.next = next;//把回收的对象添加到对象池链表头部
segment.pos = segment.limit = 0;//重置两个标识位
n