up:: ThreadLocal的两个作用
说明:
(1) 介绍ThreadLocal的主要方法:initialValue(),get(),set(),remove();
(2)声明: 本篇博客可能存在理解偏差的地方;
1.initialValue()方法:返回当前线程对应的“初始值”;
说明:
(1) 在ThreadLocal的第一种使用场景中,会用到 initialValue()方法;
(2) 而且可以看到,ThreadLocal的initialValue()方法是返回null的;所以,对于ThreadLocal的第一种使用场景,我们是必须要重写initialValue()方法的;
(3) initialValue()方法,会返回当前线程对应的“初始值”;而且,initialValue()方法是延迟加载的,只有在调用get()方法的时候,才会被触发;
(4) 假如一个有10个核心线程的线程池处理1000个任务;那么,平均来看,每个线程会执行100次任务;对于每个线程来说,只有该线程第一次执行任务的时候才会调用initialValue()方法,该线程后续执行任务调用get()方法的时候,都不会调用initialValue()方法了;(存疑……)
2.get()方法:获取对象;
说明:
(1) ThreadLocal的第一种使用场景和第二种使用场景,都会使用到get()方法;
● 对于第一种使用场景来说:initialValue()方法是延迟加载的,只有在调用get()方法的时候,才会去真正执行我们重写的initialValue()方法;
● 对于第二种使用场景中,get()方法的效果,我们会在介绍set()方法时,介绍;
3. set()方法:
说明:
(1) ThreadLocal的第二种使用场景才会使用到set()方法;
(2) 在ThreadLocal的第二种场景中,我们会使用set()方法;给对应的ThreadLocalMap赋值;然后,我们后面再使用get()方法去获取对象的时候,get()方法就可以直接获取【通过set()方法,设置的那个对象】,就不用再像第一种场景那样调用initialValue()方法了;
● 由此也能感觉到:第一种使用场景中的initialValue()方法,和,第二种使用场景中的set()方法,其作用是一样的,都是赋值;
4.remove()方法;
remove()方法的作用是:移除,某线程中的对象;
PS:上面的后果2仅仅是针对ThreadLocal的第一种使用场景来说的;(PS:同时这点还存疑)