ThreadLocal适合于以下场景:
(1) 每个线程都有;
(2) 每个线程都不一样;
(3) 作用范围为整个类。
在 Java 中,类 ThreadLocal 解决的是变量在不同线程间的隔离性。最常见的 ThreadLocal 使用场景有 数据库连接问题、Session管理等。
ThreadLocal的应用场景应该是实现在不同的线程存储不同的上下文信息的场合中,这样的场合最多的可能就是webapp中
通过原理分析可以看出,在使用ThreadLocal是应该将它声明为public static, 即所有线程共用一个ThreadLocal实例,而不是每一个线程来临时都要新创建一个ThreadLocal对象, Java Doc也建议,ThreadLocal应当声明为public static.
ThreadLocal类 是如何为每个线程创建变量的副本的:
① 每个线程内部有一个 ThreadLocal.ThreadLocalMap 类型的成员变量 threadLocals,这个 threadLocals 存储了与该线程相关的所有 ThreadLocal 变量及其对应的值(”ThreadLocal 变量及其对应的值” 就是该Map中的一个 Entry)。我们知道,Map 中存放的是一个个 Entry,其中每个 Entry 都包含一个 Key 和一个 Value。在这里,就threadLocals 而言,它的 Entry 的 Key 是 ThreadLocal 变量, Value 是该 ThreadLocal 变量对应的值;
② 初始时,在Thread里面,threadLocals为空,当通过ThreadLocal变量调用get()方法或者set()方法,就会对Thread类中的threadLocals进行初始化,并且以当前ThreadLocal变量为键值,以ThreadLocal要保存的值为value,存到 threadLocals;
③ 然后在当前线程里面,如果要使用ThreadLocal对象,就可以通过get方法获得该线程的threadLocals,然后以该ThreadLocal对象为键取得其对应的 Value,也就是ThreadLocal对象中所存储的值。
网友评论