Java多线程——ThreadLocal类

一、应用场景
每个线程实例都有自己的局部变量,ThreadLocal类为线程实例管理自己的局部变量提供了入口。

二、原理分析
每个线程实例具有"threadLocals"这个局部变量,该局部变量类型是Map,ThreadLocal类实例的set(),get()等方法能够操作“调用这些方法的线程实例中的threadLocals局部变量”,也就是说,ThreadLocal类实例为线程实例管理"threadLocals"这个局部变量提供了入口。

举例说明:
现在有一个ThreadLocal类实例object,两个线程实例A和B。
A调用object上的set()方法,set()方法会给A的局部变量"threadLocals"插入一条键值对记录,其中key为object的hashcode值,value为调用set()方法时传入的值;A调用object上的get()方法,get()方法会从A的局部变量"threadLocals"中检索key值为object的hashcode值的对应的value值
B调用object上的set()方法,set()方法会给B的局部变量"threadLocals"插入一条键值对记录,其中key为object的hashcode值,value为调用set()方法时传入的值;B调用object上的get()方法,get()方法会从B的局部变量"threadLocals"中检索key值为object的hashcode值的对应的value值

另外有一点需要注意:
当某个线程实例调用ThreadLocal类实例的get()方法,get()方法会从该线程实例的局部变量"threadLocals"中检索key值为该ThreadLocal类实例的hashcode值的对应的value值,如果get()方法发现线程实例的局部变量"threadLocals"还未初始化,或者"threadLocals"中不存在相应key值对应的记录,get()方法会调用initialValue()方法,并使用得到的结果值进行初始化
我们可以覆盖initialValue()方法改变这个初始化值


参考文献:
ThreadLocal类源代码

你可能感兴趣的:(数据区)