ThreadLocal的作用
ThreadLocal是一个线程内部的数据存储类,通过它可以在指定的线程中存储数据,数据存储以后,只有在指定的线程中可以获取到存储的数据,对于其他线程来说则无法取到数据。
ThreadLocal的主要作用
轻松实现一些看起来很复杂的功能,适合以下一些应用场景。
- 应用场景1
某些数据是以线程为作用域并且不同线程具有不同的数据的副本时,就可以考虑用ThreadLocal。
例如:Android中,Handler需要获取当前线程的Looper,很显然Looper的作用域是线程并且不同线程具有不同的Looper。
通过ThreadLocal就可以轻松实现Looper在线程中的存取。
- 应用场景2
复杂逻辑下的对象传递,比如监听器的传递,有些时候一个线程中的任务过于复杂,我们又需要监听器能够贯穿整个线程的执行过程。
采用ThreadLocal可以让监听器作为线程内的全局对象而存在,在线程内部只要通过get方法就可以获取到监听器。
ThreadLocal的两个作用总结
- 1、让某个需要用到的对象在线程间隔离(每个线程都有自己独立的对象)
- 2、在任何方法中都可以轻松获取到该对象
- 3、根据共享对象的生成时机不同,选择initialValue或set来保存对象
场景一:initialValue
- 在ThreadLocal第一次get的时候把对象给初始化出来,对象的初始化时机可以由我们控制
场景二:set
- 如果需要保存到ThreadLocal里的对象的生成时机不由我们随意控制,例如拦截器生成的用户信息,用ThreadLocal.set直接放到我们的ThreadLocal中去,以便后续使用