Okio源码阅读笔记(一)Segment与SegmentPool解析

本文主要探讨Okio库中的SegmentPool和Segment。通过源码解析,展示了SegmentPool如何实现对象池机制,减少对象创建和回收的开销。同时,详细分析了Segment结构,包括其用于标记有效数据范围的pos和limit属性,以及Segment提供的链表操作如插入、删除、拆分、共享和非共享拷贝、数据压缩等功能。
摘要由CSDN通过智能技术生成

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
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值