【转载】Recycle机制
首先要明白,Recycle机制并不是Java中的垃圾回收机制,而是相当于一种设计模式
思想:当一个对象不再使用时,储存起来,而不是让虚拟机回收,需要的时候再用,避免对象被回收之后重分配
适用范围:对于应用的生命周期内或者某一个循环内需要频繁的创建对象
不足:需要手动为废弃对象调用Recycle()方法
实现方式:
- 要一个仓库来存放暂时不用的对象
- 需要新对象的时候不去new,而是obtain(去仓库中取对象)
- Recycle(回收不再使用的对象)
简单实现:
/**
* Created by Tiou on 2014/7/15.
* 一个实现 Recycle 机制的对象
*/
public class Data { /**
* 对象池,就是上文所提到的对象仓库,用于暂时存放不用的对象。
* 用链表来实现对象池结构,直观,高效,易用。
* sPool 便是指向链表头部的引用
*/
private static Data sPool; /**
* 同步锁
*/
private static final Object sPoolSync = new Object(); /**
* 当前池中的对象数量
*/
private static int sPoolSize = 0; /**
* 对象池的最大容量
*/
private static final int MAX_POOL_SIZE = 50; /**
* 指向链表中的下一个元素,当 next 为 null 时表示已到达链表末端
*/
private Data next; /**
* 隐藏构造函数,避免对象被 new 关键字创建
*/
private Data(){} /**
* 从池里获取一个新对象,没有的话则返回一个新的实例
* @return 可用的新对象
*/
public static Data obtain(){
synchronized (sPoolSync) {
if (sPool != null) { // 池中有可用的对象
// 对于对象池来说顺序并没有关系
// 这里取链表的第一个对象,主要是因为方便
Data data = sPool;
sPool = sPool.next;
data.next = null;
sPoolSize--;
return data;
}
}
return new Data();
} /**
* 将当前对象回收,一旦对象被回收,便不能再使用,代码中也不应存有任何到该对象的引用
*/
public void recycle(){
clear(); //清理对象
synchronized (sPoolSync){
//当对象池满后,回收的对象将直接交给 GC 回收
if(sPoolSize < MAX_POOL_SIZE) {
// 把当前对象作为首元素按入链表中
next = sPool;
sPool = this;
sPoolSize++;
}
}
} /**
* 重置对象到刚初始化时的状态
*/
private void clear(){ }
}
注意:
- 对象池的容量不能无限大,具体大小可以灵活设置
- Obtain和Recycle都不是原子操作,所以在多线程时会产生问题,因此这两个方法要加锁,保证线程安全
Android中的具体实现:
参考:http://www.jianshu.com/p/5cba251c7fd9
【转载】Recycle机制的更多相关文章
- ViewPager实现Recycle机制和响应notifyDataSetChanged
1.目标 主界面要求水平移动翻页效果,每次只能翻一页,可以翻无数页. 2.实现思路 针对"每次只能翻一页"这个要求,简单使用SDK的话只有用ViewPager.ViewPager的 ...
- (转载)#include机制,#ifndef...#define...#endif防止重复引用,声明,定义等概念
一.来自百度知道的问题:全局变量可以声明定义在头文件中? 答案: 注意头文件中不可以放变量的定义!!!一般情况下头文件中只放变量的声明,因为头文件要被其他文件包含(即#include).如果把定义放到 ...
- 转载 锁机制与原子操作 <第四篇>
一.线程同步中的一些概念 1.1临界区(共享区)的概念 在多线程的环境中,可能需要共同使用一些公共资源,这些资源可能是变量,方法逻辑段等等,这些被多个线程共用的区域统称为临界区(共享区),临界区的资源 ...
- Inside of Jemalloc
INSIDE OF JEMALLOCThe Algorithm and Implementation of Jemalloc author: vector03mail: mmzsmm@163.co ...
- 【转载】Android异步消息处理机制详解及源码分析
PS一句:最终还是选择CSDN来整理发表这几年的知识点,该文章平行迁移到CSDN.因为CSDN也支持MarkDown语法了,牛逼啊! [工匠若水 http://blog.csdn.net/yanbob ...
- C#反射机制 (转载)
转载:原文出处 http://www.cnblogs.com/binfire/archive/2013/01/17/2864887.html 一:反射的定义 审查元数据并收集关于它的类型信息 ...
- Android 操作系统的内存回收机制(转载)
Android 操作系统的内存回收机制(转载) Android APP 的运行环境 Android 是一款基于 Linux 内核,面向移动终端的操作系统.为适应其作为移动平台操作系统的特殊需要,谷歌对 ...
- hibernate缓存机制详细分析 复制代码 内部资料 请勿转载 谢谢合作
您可以通过点击 右下角 的按钮 来对文章内容作出评价, 也可以通过左下方的 关注按钮 来关注我的博客的最新动态. 如果文章内容对您有帮助, 不要忘记点击右下角的 推荐按钮 来支持一下哦 如果您对文章内 ...
- [转载] Android动态加载Dex机制解析
本文转载自: http://blog.csdn.net/wy353208214/article/details/50859422 1.什么是类加载器? 类加载器(class loader)是 Java ...
随机推荐
- UOJ#117. 欧拉回路
#117. 欧拉回路 题目描述 有一天一位灵魂画师画了一张图,现在要你找出欧拉回路,即在图中找一个环使得每条边都在环上出现恰好一次. 一共两个子任务: 这张图是无向图.(50分) 这张图是有向图.(5 ...
- 微信小程序-video详解
在小程序火热的今天,作为IT行业的一员,我也来凑了一下热闹,话不多说了,接下来看看视频上传,和跨页面获取值的相关案例吧!! 视频上传部分代码: 视频播放 随机颜色的产生: 颜色页面的选择:
- angular1 实现页面切换及tag页面
tag页面实现<div class="b_gray" style="padding-left:24px;border-bottom:1px solid #ccc&q ...
- 关于map()与filter()
def f1(a): if a == 3: pass else: return a*a li = [1,2,3,4] for i in filret(f1,li) print(i) def f1(a) ...
- volatile(C# 参考)
本文档已存档,并且将不进行维护. volatile(C# 参考) 若要了解有关 Visual Studio 2017 RC 的最新文档,请参阅 Visual Studio 2017 RC 文档. vo ...
- java 包 修饰符 权限详解
作用域 当前类 同package 子孙类 其他package public √ √ √ √ protected √ √ √ × friendly(default) √ √ × ...
- YYKit笔记之FPS
FPS计算方法 FPS是Frame per second的缩写,即每秒的帧数.这一术语广泛的应用于计算机图形学,视频采集,游戏等. CADisplayLink CADisplayLink是一个能让我们 ...
- 详解 UIView 的 Tint Color 属性
在iOS 7后,UIView新增加了一个tintColor属性,这个属性定义了一个非默认的着色颜色值,其值的设置会影响到以视图为根视图的整个视图层次结构.它主要是应用到诸如app图标.导航栏.按钮等一 ...
- 关于FileSystemXmlApplicationContext和ClassPathXmlApplicationContext路径问题
在码代码的时候发现使用这两个方法写路径的时候总是存在问题,所以百度了一下解决了这个问题. 关于FileSystemXmlApplicationContext这个路径有2总写法 有盘符的代表的是绝对路径 ...
- mozilla your firefox profile cannot be loaded. it may be missing or inaccessible
check the permissions ls -l ~/.cache | grep mozilla fix the permissions sudo chown -R $USER:$USER ~/ ...