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

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

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

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

实现方式:

  1. 要一个仓库来存放暂时不用的对象
  2. 需要新对象的时候不去new,而是obtain(去仓库中取对象)
  3. 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(){ }
}

注意:

  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. 基于python第三方requests 模块的HTTP请求类

    使用requests模块构造的下载器,首先安装第三方库requests pip install requests 1 class StrongDownload(object): def __init_ ...

  2. D3.js

    html代码: <div id="id"> <p>Apple</p> <p id="aa">Pear</p ...

  3. asp.net如何把一个tostring类型转化为dateTime类型

    Convert.ToDateTime(dr["consult_DealTime"].ToString()).ToString("yyyy-MM-dd"); co ...

  4. 前端之Photoshop切片

    什么是切片 ?     (Photoshop中的切片) 切片:将图片切成几部分,一片一片往上传,这样上传的速度比较快.每个切片作为一个独立的文件传输,文件中包含切片自己的设置.颜色调板.链接.翻转效果 ...

  5. Unity 发布到IOS,Android的各种坑

    Unity 发布到IOS的注意事项1.开发环境MAC环境:Xcode环境 7.2.1Unity环境:Unity5.32.基本说明首先,我说一下,这是我在对Unity发布到IOS的实际使用中,总结出来的 ...

  6. 从键盘或文件中获取标准输入:read命令

    文件的描述符和重定向 文件描述符是和文件的输入.输出相关联的非负整数,Linux内核(kernel)利用文件描述符(file descriptor)来访问文件.打开现存文件或新建文件时,内核会返回一个 ...

  7. 十分钟学会 tmux

    tmux 是一款终端复用命令行工具,一般用于 Terminal 的窗口管理.在 macOS 下,使用 iTerm2 能应付绝大多数窗口管理的需求. 如上图所示,iTerm2 能新建多个标签页(快捷键 ...

  8. ElasticSearch(7)-排序

    引用自ElaticSearch权威指南 一.排序 相关性排序 默认情况下,结果集会按照相关性进行排序 -- 相关性越高,排名越靠前. 这一章我们会讲述相关性是什么以及它是如何计算的. 在此之前,我们先 ...

  9. Leetcode 解题报告

    347. Top K Frequent Elements Given a non-empty array of integers, return the k most frequent element ...

  10. sqlalchemy相关知识

    #!/usr/bin/env python3.5 # -*- coding:utf8 -*- # 多对多关联 from sqlalchemy import Table, Column, Integer ...