美文网首页
Message 池

Message 池

作者: Wi1ls努力努力再努力 | 来源:发表于2018-11-14 10:25 被阅读0次

创建一个 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被回收。

以上。

相关文章

网友评论

      本文标题:Message 池

      本文链接:https://www.haomeiwen.com/subject/iojdfqtx.html