ThreadLocal详解

2020-06-30  本文已影响0人  山海树

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来实现值得传递

TransmittableThreadLocal

目前看不懂
https://www.cnblogs.com/hama1993/p/10409740.html

上一篇 下一篇

猜你喜欢

热点阅读