Thread ThreadLocal ThreadLocalMap 和线程私有对象关系
每个Thread都有一个成员变量ThreadLocalMap,是线程私有的。
ThreadLocalMap存了一个table,table里保存了一些entry,每个entry对应一个key和value,而这个key就是ThreadLocal对象。保存的value就都是线程私有对象,是目标对象的一个副本。这里可以把threadLocal想象成每个对象的id标识,通过threadlocal去找到对应对象。
为什么不是用线程作为Key?
其实我第一想法是把线程作为key,利用hashmap去保证唯一性。但是想象一下key如果是当前线程的话,那么value就只能写一个变量,每个线程肯定得有多个私有变量,这样实现起来就复杂了,每次想增加变量也很麻烦,而且这样又无法避免多线程问题。
但是我们可以通过new多个ThreadLocal来保存多个线程私有对象。
如何保证一个线程就一个对应Looper?
首先是因为通过threadLocal去保证了每个looper是线程私有的。 另外是因为在looper.prepare方法里,如果threadlocal.get不为空,就会抛出异常,这样去保证不可以创建新的looper