线程常用方法join 和threadLocal

发布时间 2023-04-29 22:00:08作者: lamda表达式先驱

 

从源码中可以得知,如果想要join方法正常生效,调用join方法的线程对象必须已经调用了start()方法并且未进入终止状态。

扩展:

从join方法的源码来看,join方法的本质调用的是Object中的wait方法实现线程的阻塞,wait方法的实现原理在后续的文章中在说详细阐述。**但是我们需要知道的是,调用wait方法必须要获取锁,**所以join方法是被synchronized修饰的,synchronized修饰在很多层面相当于synchronized(this),this就说Thread本身的实例。

有很多人不理解join为什么阻塞的是主线程呢?不理解的原因是阻塞主线程的方法是放在Thread这个实例中的作用,让大家误以为应该阻塞thread线程。实际上主线程会持有thread这个对象的锁,然后调用wait方法去阻塞,而这个方法的调用者是在主线程中的。所以造成主线程阻塞。

第二个问题:为什么Thread线程执行完毕就能够唤醒主线程呢?或者说在什么时候唤醒的呢?

要了解这个问题,我们又得翻jdk源码,但是如果对线程有既定得基本了解得话,通过wait方法阻塞得线程,需要通过notify或者notifyAll()方法来唤醒。所以在线程执行完毕以后会有一个唤醒得操作,只是在虚拟机内部通过调用native方法实现得

 springmvc 每一个请求都要经过过滤器,拦截器,再到servlet再到视图,可以在当前线程的上下文一直获取这个值

用了threadLocal 最好进行一个清除释放,因为springmvc用的是线程池,它下一次可能给其他请求之间使用,就是前世的记忆影响了现实,

threadLocal 源码是一个threadlocals,是一个线程对象的局部变量

 他还是一个弱引用, 可以便于被gc清理

最后这里用弱引用是因为threadlocal创建的时候就有了一个强引用指向了他,如果这里entry的Threadlocal还用强引用,就会导致外面被回收,里面永远无法被回收,导致内存泄漏