【转载】Recycle机制
首先要明白,Recycle机制并不是Java中的垃圾回收机制,而是相当于一种设计模式
思想:当一个对象不再使用时,储存起来,而不是让虚拟机回收,需要的时候再用,避免对象被回收之后重分配
适用范围:对于应用的生命周期内或者某一个循环内需要频繁的创建对象
不足:需要手动为废弃对象调用Recycle()方法
实现方式:
- 要一个仓库来存放暂时不用的对象
- 需要新对象的时候不去new,而是obtain(去仓库中取对象)
- 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 }
注意:
- 对象池的容量不能无限大,具体大小可以灵活设置
- Obtain和Recycle都不是原子操作,所以在多线程时会产生问题,因此这两个方法要加锁,保证线程安全
Android中的具体实现:
参考:http://www.jianshu.com/p/5cba251c7fd9

浙公网安备 33010602011771号