Android SimplePool 和 SynchronizedPool 的区别

Android SimplePool 和 SynchronizedPool 的区别

  • SimplePool 简单池和 SynchronizedPool 同步池都属于对象池的实现,都是 android.core.util.Pools 类的一部分,主要用于对象的复用,以此减少对象频繁创建和销毁带来的性能开销(避免频繁触发 GC 操作)
  • SimplePool 和 SynchronizedPool 是基于数组实现的(内部使用一个数组来存储对象)
  • PS:Android Message 类的 Message Pool 是基于链表实现的(通过 Message#obtain 复用消息),Glide 内部的 KeyPool 是基于 Queue 队列实现的,Glide 内部的 BitmapPool 是基于带了 LRU 算法的 Map 实现的

SimplePool

  • SimplePool 是非线程安全的对象池,适用于单线程环境
  • SimplePool 继承自 androidx.core.util.Pools.Pool 接口,通过记录当前池中的对象数量,实现对象的入池和出池操作
  • 对象池的大小在创建时指定,无法动态调整,按需求设置 maxPoolSize,过大的池会浪费内存,过小则无法发挥复用优势
java 复制代码
public class MyPooledObject {
    private static final SimplePool<MyPooledObject> sPool = new SimplePool<>(5);

    public static MyPooledObject obtain() {
        //从对象池中获取对象
        MyPooledObject instance = sPool.acquire(); //获取
        //如果池中没有可用对象就创建一个新的
        return (instance != null) ? instance : new MyPooledObject();
    }

    public void recycle() {
        //将对象放回对象池(存到数组末尾),如果池已满,对象会被丢弃
        sPool.release(this);
    }
}

SynchronizedPool

  • SynchronizedPool 是线程安全的对象池,使用 synchronized 关键字来保证线程安全(在 acquire 和 release 方法上加锁来实现)
  • SynchronizedPool 继承自 SimplePool,是 SimplePool 的同步版本
java 复制代码
public class MySyncPooledObject {
    private static final SynchronizedPool<MySyncPooledObject> sPool = new SynchronizedPool<>(5);

    public static MySyncPooledObject obtain() {
        MySyncPooledObject instance = sPool.acquire();
        return (instance != null) ? instance : new MySyncPooledObject();
    }

    public void recycle() {
        sPool.release(this);
    }
}
相关推荐
有位神秘人2 小时前
Android获取设备中本地音频
android·音视频
JMchen1232 小时前
Android网络安全实战:从HTTPS到双向认证
android·经验分享·网络协议·安全·web安全·https·kotlin
CS创新实验室2 小时前
Pandas 3 的新功能
android·ide·pandas
ujainu3 小时前
护眼又美观:Flutter + OpenHarmony 鸿蒙记事本一键切换夜间模式(四)
android·flutter·harmonyos
三少爷的鞋3 小时前
为什么我不在 Android ViewModel 中直接处理异常?
android
草莓熊Lotso4 小时前
Linux 文件描述符与重定向实战:从原理到 minishell 实现
android·linux·运维·服务器·数据库·c++·人工智能
恋猫de小郭4 小时前
Flutter Zero 是什么?它的出现有什么意义?为什么你需要了解下?
android·前端·flutter
工程师老罗10 小时前
如何在Android工程中配置NDK版本
android
Libraeking14 小时前
破壁行动:在旧项目中丝滑嵌入 Compose(混合开发实战)
android·经验分享·android jetpack
市场部需要一个软件开发岗位14 小时前
JAVA开发常见安全问题:Cookie 中明文存储用户名、密码
android·java·安全