一句话读懂Threadlocal

threadlocal是把ThreadLocal实例做为key,要保持的对象做为值,设置到当前线程的ThreadLocalMap 中。所以数据是保存在当前线程中的。java

ThreadLocalMap实例是做为java.lang.Thread的成员变量存储的,每一个线程有惟一的一个threadLocalMap。这个map以ThreadLocal对象为key,”线程局部变量”为值,因此一个线程下能够保存多个”线程局部变量”。对ThreadLocal的操做,实际委托给当前Thread,每一个Thread都会有本身独立的ThreadLocalMap实例,存储的仓库是Entry[] table;Entry的key为ThreadLocal,value为存储内容;所以在并发环境下,对ThreadLocal的set或get,不会有任何问题。并发

总之,ThreadLocal不是用来解决对象共享访问问题的,而主要是提供了保持对象的方法和避免参数传递的方便的对象访问方式。概括了两点:spa

  1. 每一个线程中都有一个本身的ThreadLocalMap类对象,能够将线程本身的对象保持到其中,各管各的,线程能够正确的访问到本身的对象。线程

  2. 将一个共用的ThreadLocal静态实例做为key,将不一样对象的引用保存到不一样线程的ThreadLocalMap中,而后在线程执行的各处经过这个静态ThreadLocal实例的get()方法取得本身线程保存的那个对象,避免了将这个对象做为参数传递的麻烦。orm

ThreadLocal建议

  1. ThreadLocal应定义为静态成员变量。对象

  2. 能经过传值传递的参数,不要经过ThreadLocal存储,以避免形成ThreadLocal的滥用。内存

  3. 在线程池的状况下,在ThreadLocal业务周期处理完成时,最好显式的调用remove()方法,清空”线程局部变量”中的值。rem

  4. 正常状况下使用ThreadLocal不会形成内存溢出,弱引用的只是threadLocal,保存的值依然是强引用的,若是threadLocal依然被其余对象强引用,”线程局部变量”是没法回收的。get

相关文章
相关标签/搜索