首先要明白,Recycle机制并不是Java中的垃圾回收机制,而是相当于一种设计模式

思想:当一个对象不再使用时,储存起来,而不是让虚拟机回收,需要的时候再用,避免对象被回收之后重分配

适用范围:对于应用的生命周期内或者某一个循环内需要频繁的创建对象

不足:需要手动为废弃对象调用Recycle()方法

实现方式:

  1. 要一个仓库来存放暂时不用的对象
  2. 需要新对象的时候不去new,而是obtain(去仓库中取对象)
  3. Recycle(回收不再使用的对象)

简单实现:

  1. /**
  2. * Created by Tiou on 2014/7/15.
  3. * 一个实现 Recycle 机制的对象
  4. */
  5. public class Data {
  6.  
  7. /**
  8. * 对象池,就是上文所提到的对象仓库,用于暂时存放不用的对象。
  9. * 用链表来实现对象池结构,直观,高效,易用。
  10. * sPool 便是指向链表头部的引用
  11. */
  12. private static Data sPool;
  13.  
  14. /**
  15. * 同步锁
  16. */
  17. private static final Object sPoolSync = new Object();
  18.  
  19. /**
  20. * 当前池中的对象数量
  21. */
  22. private static int sPoolSize = 0;
  23.  
  24. /**
  25. * 对象池的最大容量
  26. */
  27. private static final int MAX_POOL_SIZE = 50;
  28.  
  29. /**
  30. * 指向链表中的下一个元素,当 next 为 null 时表示已到达链表末端
  31. */
  32. private Data next;
  33.  
  34. /**
  35. * 隐藏构造函数,避免对象被 new 关键字创建
  36. */
  37. private Data(){}
  38.  
  39. /**
  40. * 从池里获取一个新对象,没有的话则返回一个新的实例
  41. * @return 可用的新对象
  42. */
  43. public static Data obtain(){
  44. synchronized (sPoolSync) {
  45. if (sPool != null) { // 池中有可用的对象
  46. // 对于对象池来说顺序并没有关系
  47. // 这里取链表的第一个对象,主要是因为方便
  48. Data data = sPool;
  49. sPool = sPool.next;
  50. data.next = null;
  51. sPoolSize--;
  52. return data;
  53. }
  54. }
  55. return new Data();
  56. }
  57.  
  58. /**
  59. * 将当前对象回收,一旦对象被回收,便不能再使用,代码中也不应存有任何到该对象的引用
  60. */
  61. public void recycle(){
  62. clear(); //清理对象
  63. synchronized (sPoolSync){
  64. //当对象池满后,回收的对象将直接交给 GC 回收
  65. if(sPoolSize < MAX_POOL_SIZE) {
  66. // 把当前对象作为首元素按入链表中
  67. next = sPool;
  68. sPool = this;
  69. sPoolSize++;
  70. }
  71. }
  72. }
  73.  
  74. /**
  75. * 重置对象到刚初始化时的状态
  76. */
  77. private void clear(){
  78.  
  79. }
  80. }

注意:

  1. 对象池的容量不能无限大,具体大小可以灵活设置
  2. Obtain和Recycle都不是原子操作,所以在多线程时会产生问题,因此这两个方法要加锁,保证线程安全

Android中的具体实现:

参考:http://www.jianshu.com/p/5cba251c7fd9

【转载】Recycle机制的更多相关文章

  1. ViewPager实现Recycle机制和响应notifyDataSetChanged

    1.目标 主界面要求水平移动翻页效果,每次只能翻一页,可以翻无数页. 2.实现思路 针对"每次只能翻一页"这个要求,简单使用SDK的话只有用ViewPager.ViewPager的 ...

  2. (转载)#include机制,#ifndef...#define...#endif防止重复引用,声明,定义等概念

    一.来自百度知道的问题:全局变量可以声明定义在头文件中? 答案: 注意头文件中不可以放变量的定义!!!一般情况下头文件中只放变量的声明,因为头文件要被其他文件包含(即#include).如果把定义放到 ...

  3. 转载 锁机制与原子操作 <第四篇>

    一.线程同步中的一些概念 1.1临界区(共享区)的概念 在多线程的环境中,可能需要共同使用一些公共资源,这些资源可能是变量,方法逻辑段等等,这些被多个线程共用的区域统称为临界区(共享区),临界区的资源 ...

  4. Inside of Jemalloc

    INSIDE OF JEMALLOCThe Algorithm and Implementation of Jemalloc author: vector03mail:   mmzsmm@163.co ...

  5. 【转载】Android异步消息处理机制详解及源码分析

    PS一句:最终还是选择CSDN来整理发表这几年的知识点,该文章平行迁移到CSDN.因为CSDN也支持MarkDown语法了,牛逼啊! [工匠若水 http://blog.csdn.net/yanbob ...

  6. C#反射机制 (转载)

    转载:原文出处      http://www.cnblogs.com/binfire/archive/2013/01/17/2864887.html 一:反射的定义 审查元数据并收集关于它的类型信息 ...

  7. Android 操作系统的内存回收机制(转载)

    Android 操作系统的内存回收机制(转载) Android APP 的运行环境 Android 是一款基于 Linux 内核,面向移动终端的操作系统.为适应其作为移动平台操作系统的特殊需要,谷歌对 ...

  8. hibernate缓存机制详细分析 复制代码 内部资料 请勿转载 谢谢合作

    您可以通过点击 右下角 的按钮 来对文章内容作出评价, 也可以通过左下方的 关注按钮 来关注我的博客的最新动态. 如果文章内容对您有帮助, 不要忘记点击右下角的 推荐按钮 来支持一下哦 如果您对文章内 ...

  9. [转载] Android动态加载Dex机制解析

    本文转载自: http://blog.csdn.net/wy353208214/article/details/50859422 1.什么是类加载器? 类加载器(class loader)是 Java ...

随机推荐

  1. url截取

    <!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title&g ...

  2. openstack trove,使pylint忽略错误

    一.什么是pylint Pylint 是一个 Python 代码分析工具,它分析 Python 代码中的错误,查找不符合代码风格标准和有潜在问题的代码. Pylint 是一个 Python 工具,除了 ...

  3. mongodb tip-2

    1.or 查询的格式: var condition = {$or:[{field:1},{field:2}]} 2.字符串存储日期也可以用$gt $gte $lt $lte 直接比较 var cond ...

  4. oracle数据库一些用户管理语句

    查询所有数据库用户 select * from dba_users 查看数据库名称 select name from v$database 查看权限 select * from user_sys_pr ...

  5. linux的环境变量设置

    source/etc/profile是让/etc/profile文件修改后立即生效, 还有一种方法是:. /etc/profile 注意:.和/etc/profile有空格 linux中source命 ...

  6. <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 ...

  7. express mongoose 新手上路 问题记录

    1.npm start启动报错,提示端口占用 app.js中添加了app.listen(3000),删掉即可 2.跳转到html页面 //ejs改为html app.engine('.html', r ...

  8. Linux中一些简单命令(一)

    1.查看当前用户:who 2.显示当前目录:pwd 3.查看当前服务器的时间:date 4.查看日历:cal+year; 例如:cal 2016 5.计算器:bc  退出计算器:quit或者ctrl+ ...

  9. lda 主题模型--TOPIC MODEL--Gibbslda++结果分析

    在之前的博客中已经详细介绍了如何用Gibbs做LDA抽样.(http://www.cnblogs.com/nlp-yekai/p/3711384.html) 这里,我们讨论一下实验结果: 结果文件包括 ...

  10. javascript variables 变量

    一,调试方法: 1.document.write();       直接在网页中显示. 2.alert();                       弹窗显示. 3.console.       ...