一、概念
用处 | 每个线程需要持有自己单独的数据,数据在同线程中被多个地方共享,但多线程中不共享。 |
原理 | 创建 ThreadLocal 对象用来存取值,操作的是 CurrentThread 里的 ThreadLocalMap,由于每个 Thread 中都有自己的 ThreadLocalMap,当不同 Thread 访问代码时,ThreadLocal 操作的是它们各自持有的数据。 |
1.1 与 synchornized 区别
synchornized | ThreadLocal | |
相同 | 都是用于解决多线程并发访问安全。 | |
区别 | synchornized用于线程间数据共享。 | ThreadLocal用于线程间数据隔离。 |
利用锁的机制,使变量或代码块在同一时刻只能被一个线程访问。 | 为每个线程提供自己的变量,使不同线程访问时,代码操作的是它们各自持有的数据。 |
二、Thread
类中有一个成员变量 threadLocals 它是一个空的 ThreadLocalMap。
三、ThreadLocal
在一个线程中可以创建多个 ThreadLocal 对象(作用是当作key存入value),不管是调用 ThreadLocal 对象的 get() 还是 set() 内部都会先获取当前线程Thread,然后获取 Thread 所持有的 ThreadLocalMap(即Thread的成员变量threadLocals)判断是否为 null:
- 为 null 就创建一个 ThreadLocalMap 并赋值,set() 是接着以该 ThreadLocal 为 key 存入目标值、get() 是接着以该 ThreadLocal 为 key 存入初始化值(默认null,在get()之前调用过 setInitialValue() 或创建 ThreadLocal 时重写过 initialValue() 的话就是自定义的值)。
- 不为 null 的话,get() 就获取该 ThreadLocal 对象(key)对应的 value(在Android中是Looper),set() 就以该ThreadLocal 对象为 key 存入 value(在Android中是Looper)。
四、ThreadLocalMap
是 ThreadLocal 的静态内部类。Entry 继承于 WeakReference,key 是 ThreadLocal 类型,value是 Object 类型。