手机建造网站,做网站的厉害还是黑网站的厉害,做网站服务销售,网站seo方案案例文章目录 ThreadLocal与Thread关系分析Threadlocal 不支持继承性lnheritableThreadLocal 类 ThreadLocal与Thread关系分析 由该图可知#xff0c; Thread 类中有一个 threadLocals 和一个 inheritableThreadLocals #xff0c; 它们 都是 ThreadLocalMap 类型 的变量 #x… 文章目录 ThreadLocal与Thread关系分析Threadlocal 不支持继承性lnheritableThreadLocal 类 ThreadLocal与Thread关系分析 由该图可知 Thread 类中有一个 threadLocals 和一个 inheritableThreadLocals 它们 都是 ThreadLocalMap 类型 的变量 而 ThreadLocalMap 是一个定制化的 Hashmap 。 在默认情况下 每个线程中的这两个变量都为 null只有当前线程第一次调用 ThreadLocal 的 set 或者 get 方法时才会创建它们 。 其实每个线程的本地变量不是存放在 ThreadLocal 实例 里面而是存放在调用线程的 threadLocals 变量里面 。 也就是说 ThreadLocal 类型的本地变量存放在具体的线程内存空间中 。 ThreadLocal 就是一个工具壳它通过 set 方法把 value 值放入调用线程的 threadLocals 里面并存放起来 当调用 线程调用它的 get 方法时再从当 前线程的 threadLocals 变量里面将其拿出来使用 。 如果调用线程一直不终止 那么这个本地变量会一直存放在调用线程的 threadLocals 变量里面 所以当不需要使用本地变量时可以通过调用 ThreadLocal 变量的 remove 方法 从当前线程的 threadLocals 里面删除该本地变量 。另外 Thread 里面 的 threadLocals 为何被设计为 map 结构很明显是因为每个线程可以关联多个 ThreadLocal 变量。
Threadlocal 不支持继承性
同一个 ThreadLocal 变量在父线程中被设置值后 在子线程中 是获取不到的。这应该是正常现象因为在子线程 thread 里面调用 get 方法时当前线程为 thread 线程而这里调用 set 方法设置线程变量的是 main 线程两者是不同的线程自然子线程访 问时返回 null。那么有没有办法让子线程能访问到父线程中的值 答案是有 。
lnheritableThreadLocal 类
为了解决ThreadLocal不支持继承的问题 lnheritableThreadLocal 应运 而 生。 InheritableThreadLocal继承自 ThreadLocal 其提供了一个特性就是让子线程可 以访问在父线程中设置的本地变量 。在 InheritableThreadLocal 的世 界里 变量 inheritableThreadLocals 替 代 了 threadLocals 。我们需要在父线程时将需要存储的数据使用lnheritableThreadLocal 放入Thread的inheritableThreadLocals中然后在new子线程时Thread的构造函数内就会判断父线程inheritableThreadLocals中是否存在数据存在的话就会将数据放入子线程的inheritableThreadLocals中。这样就实现了父子线程的数据传递。在子线程的时候就可以使用InheritableThreadLocal获取来自父线程传递来的数据。