ThreadLocal——线程变量,是Thread的局部变量,用于编多线程程序。
ThreadLocal是Java中的一个类,它提供了一种线程局部变量的机制。每个ThreadLocal对象都可以维护一个线程私有的变量副本,这样每个线程都可以独立地操作自己的副本,而不会影响其他线程的副本。
例如:
每个线程都要使用A对象,一起对A进行操作会有线程安全问题。
使用ThreadLocal时会对象初始化成本线程独有的对象,便于线程使用且其他线程无法使用。
使用ThreadLocal让某个需要用到的对象在线程间隔离(每个线程都有自己的独立的对象),且在任何方法中都可以轻松获取到该对象。不仅实现了线程安全,同时不需要加锁,提高了执行效率,更高效的利用内存、节省开销。
ThreadLocal的方法:
T initialValue(): 初始化,会返回当前线程对应的初始值,这是一个延迟加载的方法,只有在调用get()方法的时候才会触发
T get(): 得到这个线程对应的 value。如果是首次调用 get(),则会调用 initialize 来得到这个值。
void set(T t): 为这个线程设置一个新值
void remove(): 删除对应这个线程的值
ThreadLocal的调用方法:
当线程使用threadlocal 时,是将threadlocal当做当前线程thread的属性ThreadLocalMap 中的一个Entry的key值,实际上存放的变量是,Entry的value值,我们实际要使用的值是value值。即健为此ThreadLocal,值为实际需要的成员变量。
使用ThreadLocal时要注意内存泄露,key的泄露和value的泄露,Entry未删除或者CurrentThread 当前线程依然运行。由于ThreadLocalMap 的生命周期跟 Thread 一样长,对于重复利用的线程来说,如果没有手动删除(remove()方法)对应 key 就会导致entry(null,value)的对象越来越多,从而导致内存泄漏.