1.通过 synchronize 关键字,各线程可以共享变量。而通过 ThreadLocal 各线程彼此分隔,维护只属于自己的变量。
2.ThreadLocal 本身不保存什么数据,它主要提供操作方法,从 ThreadLocalMap 中存取数据。
3.ThreadLocal 联系着 Thread 和 ThreadLocalMap,每个 Thread 保存一个 ThreadLocalMap 。
4.一个 Thread 或者一个类中,可以创建多个 ThreadLocal。一般把 ThreadLocal 变量定义为 static 类型,防止重复创建 key(ThreadLocal )。
5.ThreadLocal 的 get set 方法源码
6.Looper.class 中的 ThreadLocal 使用示例。
这里 sThreadLocal 为 static 类型,因此所有 looper 共享一个 ThreadLocal 实例。又因为每个线程对应一个 looper,所以实际上所有线程共享这个 ThreadLocal 实例,各线程中的 ThreadLocalMap 以 sThreadLocal 为 key,保存着各线程自己的 looper。
这里 的 prepare() 和 prepareMainLooper() 方法中,sThreadLocal.get() != null,确定了 Thread 和 Looper 的一一对应关系:Looper 是以 sThreadLocal 为 key,保存在 每个 Thread 的 ThreadLocalMap 中
7.ThreadLocal 的set方法源码
此方法确定了 Thread 和 ThreadLocalMap 的一对一关系。
8.ThreadLocal 使用示例
class Example{
static ThreadLocal<Example> sThreadLocal = new ThreadLocal<Example>();
public void saveExample(){
sThreadLocal.set(this);
}
public Example getExample(){
return sThreadLocal.get();
}
}
9. Thread 和 ThreadLocalMap 是一对一的关系,见 ThreadLocal 的 set 方法(第7点);
Thread 和 Looper 也是 一对一关系,见 Looper 的 prepare 方法(第6点)
Thread 和 ThreadLocal 可以是 一对多的关系