【转载】Recycle机制

首先要明白,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

 

posted @ 2016-02-22 22:40  TwoFish  阅读(476)  评论(0)    收藏  举报