【转载】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 ...
随机推荐
- url截取
<!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title&g ...
- openstack trove,使pylint忽略错误
一.什么是pylint Pylint 是一个 Python 代码分析工具,它分析 Python 代码中的错误,查找不符合代码风格标准和有潜在问题的代码. Pylint 是一个 Python 工具,除了 ...
- mongodb tip-2
1.or 查询的格式: var condition = {$or:[{field:1},{field:2}]} 2.字符串存储日期也可以用$gt $gte $lt $lte 直接比较 var cond ...
- oracle数据库一些用户管理语句
查询所有数据库用户 select * from dba_users 查看数据库名称 select name from v$database 查看权限 select * from user_sys_pr ...
- linux的环境变量设置
source/etc/profile是让/etc/profile文件修改后立即生效, 还有一种方法是:. /etc/profile 注意:.和/etc/profile有空格 linux中source命 ...
- <poj - 2139> Six Degrees of Cowvin Bacon 最短路径问题 the cow have been making movies
本题链接:http://poj.org/problem?id=2139 Description: The cows have been making movies lately, so the ...
- express mongoose 新手上路 问题记录
1.npm start启动报错,提示端口占用 app.js中添加了app.listen(3000),删掉即可 2.跳转到html页面 //ejs改为html app.engine('.html', r ...
- Linux中一些简单命令(一)
1.查看当前用户:who 2.显示当前目录:pwd 3.查看当前服务器的时间:date 4.查看日历:cal+year; 例如:cal 2016 5.计算器:bc 退出计算器:quit或者ctrl+ ...
- lda 主题模型--TOPIC MODEL--Gibbslda++结果分析
在之前的博客中已经详细介绍了如何用Gibbs做LDA抽样.(http://www.cnblogs.com/nlp-yekai/p/3711384.html) 这里,我们讨论一下实验结果: 结果文件包括 ...
- javascript variables 变量
一,调试方法: 1.document.write(); 直接在网页中显示. 2.alert(); 弹窗显示. 3.console. ...