Message 池

2018-11-14  本文已影响0人  Wi1ls努力努力再努力

创建一个 Message 的推荐做法是obtain()@Message 而不是new Message(),是因为 Message 内部维系了一个 Message 池,这个线程池是一个单向链表。自动化进行 Message 的实例化,回收和复用。

Message next;
private static Message sPool;
private static int sPoolSize = 0;

public static Message obtain(){
  synchornized (sPoolSync){
    if(sPool !=null){
      Message m = sPool; 
      sPool = m.next;
      m.next = null; 
      m.flags = 0;
      sPoolSize--;
      return m;
    }
  }
  return new Message();
}

第一次进来的时候,sPool = null,直接new Message()返回。当 Message 被回收时,

void recycleUnchecked(){
  flags = FLAG_IN_USE;
  what = 0;
  arg1 = 0;
  arg2 = 0;
  obj = null;
  ...
  synchronized (sPoolSync){
    if(sPoolSize < MAX_POOL_SIZE){
      next = sPool;
      sPool = this;
      sPoolSize ++ ;
    }
  }
}

可以看到,当一个 Message 被回收后,清空 Message 的信息,然后加入到了这个线程池中,将当前 Message 作为表头放入到链表中,同时将池的大小++,
接下里重新看sPool != null 的逻辑

 if(sPool !=null){
      Message m = sPool; 
      sPool = m.next;
      m.next = null; 
      m.flags = 0;
      sPoolSize--;
      return m;
    }

此时取出位于表头的 Message,将m.next 设置为新的表头,池的大小--,随后返回这个 Message。

当 池中有 N 个 Message元素时,被用完后sPool 就被设置成了 null,想继续获得一个 Message 会直接new Message(),除非有旧的 Message被回收。

以上。

上一篇 下一篇

猜你喜欢

热点阅读