ThreadLocal的原理
ThreadLocal的原理
ThreadLocal的实现依赖于Thread类中的一个ThreadLocalMap字段,这是一个存储ThreadLocal变量本身和对应值的映射。
每个线程都有自己的ThreadLocalMap实例,用于存储该线程所持有的所有ThreadLocal变量的值。
当你创建一个ThreadLocal变量的时候,它实际上就是一个ThreadLocal对象的实例,每个ThreadLocal对象都可以存储任意类型的值,这个值对于每个线程来说是独立的。
get()、set()和remove()方法
get()方法
当调用ThreadLocal的get()方法的时候,ThreadLocal会检查当前线程的ThreadLocalMap中是否有与值关联的值。
如果有,就返回该值
如果没有,会调用initialValue()方法初始化该值,然后将其放入ThreadLocalMap中并返回。
如果之前没有设置过值,ThreadLocal会调用initialValue()方法来获取一个默认值。 举个例子:
|
|
如果当前线程的ThreadLocalMap中没有与该ThreadLocal对象关联的值,get()方法会调用ThreadLocal的initialValue()方法来获取一个默认值,并将这个值存储在ThreadLocalMap中。 如果ThreadLocalMap中已经存在与该ThreadLocal对象关联的值,get()方法会直接返回这个值,而不会调用initialValue()方法。
set()方法
当调用set()方法的时候,ThreadLocal会将给定值与当前线程管来弄起来 也就是在ThreadLocalMap中存储一个键值对,key是ThreadLocal对象本身,value是传入的值。
remove()方法
当调用remove()方法的时候,ThreadLocal会从当前线程的ThreadLocalMap中删除与该ThreadLocal对象关联的值。