ThreadLocal
内置静态内部类ThreadLocalMap
ThreadLocalMap中Entry<ThreadLocal<?>tl ,Object o>,其中tl为弱引用,是为了方便当ThreadLocal过期是,gc回收ThreadLocalMap,避免内存泄漏。
当ThreadLocal.set(Object value)时,会获取当前线程Thread.currentThread()。拿到当前线程持有的ThreadLocalMap,将ThreadLocal作为key,value作为值,存储起来。
当ThreadLcal.get()时,同样会获取当前线程Thread.currentThread()。拿到当前线程的ThreadLocalMap,通过get(this),来拿到存储的值。其中this就是ThreadLocal对象。
也就是说,同一个线程中,同一个ThreadLocal只能有一个值,但是反过来,同一个ThreadLocal可以存多个Thread的值
InheritableThreadLocal
在多线程的情况下,主线程中new的线程称为子线程,当需要将主线程的值传到子线程时,可以使用InhreitableThreadLocal来实现。
InhreitableThreadLocal是extend ThreadLocal的一个类,他的实现原理就是使用Thread的inhreitableThreadLocals属性,也就是另一个ThreadLocalMap变量。
当在主线程中实例化子线程时(new Thread()),会调用Thread的init方法,该方法中会判断父线程的inheritableThreadLocals是否为空,不为空则将该值赋值给子线程的inheritableThreadLocals属性。
父子线程通过inheritableThreadLocals来实现值得传递
网友评论