Android 消息机制—ThreadLocal

ThreadLocal:
一般来说,当某些数据是以线程为作用域并且不同线程具有不同的数据副本的时候,可以考虑采用 ThreadLocal。ThreadLocal并不是一个thread,而是Thread的局部变量。是一个线程内部的数据存储类,通过它可以在指定的线程中存储数据,数据存储以后,只有在指定线程中可以获取到存储的数据,其他线程则无法获取。当使用ThreadLocal维护变量时,ThreadLocal为每个使用该变量的线程提供独立的变量副本,而不会影响其他线程所对应的副本。从线程的角度看,目标变量就像是线程的本地变量,这也是类名中Local所要表达的意思。针对这个用法,我们写个测试demo。
Android 消息机制—ThreadLocal
注释写的很清楚啦,demo中我们主线程中定义一个全局变量 mIntegerThreadLocal,主线程中设置值为0并打印,子线程 Thread#1 中直接打印变量值,子线程 Thread#2 中设置值为2并打印出来。下面为我们打印日志:
Android 消息机制—ThreadLocal
可以看出,主线程打印值为 0,Thread#1 线程打印值为 null,Thread#2 线程打印值为 2。他们获取的对象是一样的,不同线程中获取到的值是不同的。
ThreadLocal是如何做到为每一个线程维护变量的副本的呢?
ThreadLocal 类中有个静态类 ThreadLocalMap,Thread 中有个变量 threadLocals,类型为ThreadLocal.ThreadLocalMap,就是说每个 Thread 中都有一个 ThreadLocalMap。ThreadLocal 可以根据当前 Thread 去查询当前 Thread 的 ThreadLocalMap值。不同线程中的 ThreadLocalMap 中存储的值是不同的。
下面我们看一下 ThreadLocal 的内部实现:Android 消息机制—ThreadLocal
set 方法设置当前线程值,方法中先获取到当前线程,然后根据当前线程获取到 ThreadLocalMap 对象。如果 map 存在,存储当前值,如果不存在,调用 createMap 方法创建一个 ThreadLocalMap,并传入 value 值。
Android 消息机制—ThreadLocal
get 方法也是现获取当前线程,然后根据线程获取当前线程的 ThreadLocalMap 对象,进而得到存储的value值。