up:: ThreadLocal第二种使用场景
说明:
(1) 在【ThreadLocal第一种使用场景】和【ThreadLocal第二种使用场景】这两篇博客,我们演示了ThreadLocal的两种使用场景;本篇博客,我们尝试总结一下ThreadLocal的作用和好处;
(2)声明: 对于本篇博客的内容,没必要太认真;ThreadLocal还是需要在实际应用中,才能更好的加深理解;
一:ThreadLocal的两个作用;
说明:
(1) 第一个作用:
● 第一种使用场景中的体现:
通过,其执行效果,可以发现,不同线程都有各自的SimpleDateFormat对象;
● 第二种使用场景中的体现:
通过,其执行效果,可以发现,不同线程都有各自的当前线程中的任务的信息;
(2) 第二个作用:
● 第一种使用场景中的体现:
● 第二种使用场景中的体现:
二:由【对象生成的时机,的不同】,来分析ThreadLocal两种不同的使用场景;
(1)ThreadLocal第一种使用场景:使用initialValue()的方式,来把对象保存到ThreadLocal中;
● 在初始化ThreadLocal(这儿具体来说就是ThreadSafeFormatter类)的时候,就已经把SimpleDateFormat对象给初始化进ThreadLocal中了;
● 但需要明白,ThreadSafeFormatter类中初始化SimpleDateFormat的代码是我们编写的;即,是我们规定,在初始化ThreadSafeFormatter类的时候,就把SimpleDateFormat对象给初始化进ThreadLocal中;如果我们不编写这条语句,其自然在初始化ThreadSafeFormatter类的时候,就不会SimpleDateFormat对象给初始化进ThreadLocal中;
● 即,在第一种场景中,对象的创建时机是由我们控制的;
(2)ThreadLocal第二种使用场景:使用set()的方式,来把对象保存到ThreadLocal中;
● 场景二中,在ThreadLocal类中,我们创建了holder;这个holder一旦创建了,其就会是一直等待的状态;等待数据被存进来;而,究竟什么时候存进来,不是有UserContextHolder这个ThreadLocal类决定的,而是由Service1决定的;