首页 > 其他分享 >线程常用方法join 和threadLocal

线程常用方法join 和threadLocal

时间:2023-04-29 22:12:44浏览次数:36  
标签:调用 join 阻塞 threadLocal 线程 方法 wait

 

从源码中可以得知,如果想要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还用强引用,就会导致外面被回收,里面永远无法被回收,导致内存泄漏

 

 

 

 

 

 

标签:调用,join,阻塞,threadLocal,线程,方法,wait
From: https://www.cnblogs.com/ZhangZiXue/p/17364550.html

相关文章

  • C++-std::this_thread::get_id()-获取线程id
    C++-std::this_thread::get_id()-获取线程idstd::this_thread::get_id()头文件:<thread>函数:std::this_thread::get_id()用例:std::thread::idthread_id=std::this_thread::get_id();std::thread对象的成员函数get_id()头文件:<thread>函数:std::thread::idget_id()用例:......
  • 线程池易忘知识点
    What主要用于整理线程中容易忘记的点以及不太好理解的内容shutdownvsshutdownNow两者都是用于关闭线程池,但是也有着很大区别shutdown方法行为会使得线程池的状态变成SHUTDOWN,线程池不再接收新来的任务。中断空闲的线程(从阻塞队列拿不到任务被阻塞),正在执行任务的线程不......
  • 【协程】进程,线程和协程
    进程进程,描述的是程序的执行过程,是运行着程序的代表,在操作系统中,每个进程的内存空间都是独立的,使用多进程并发有两个缺点:一是内核的管理成本高,而是无法简单地通过内存同步数据(进程运行的虚拟内存空间),很不方便,于是多线程模式就出现了。线程线程是操作系统能够运行运算调度的最......
  • 实验2 多线程
    创建一个线程#include<stdio.h>#include<unistd.h>#include<pthread.h>#include<sys/types.h>void*threadFunc(void*arg){printf("InNEWthreaad\n");}intmain(){ pthread_ttid;//createthreadfunctionpthread_create(......
  • HashMap为什么存在线程不安全呢?
    关注Java后端技术栈“回复“面试”获取最新资料本文主要探讨下HashMap在多线程环境下容易出现哪些问题,深层次理解其中的HashMap。我们都知道HashMap是线程不安全的,但是HashMap在咱们日常工作中使用频率在所有map中确实属于比较高的。因为它可以满足我们大多数的场景了。上面展示了......
  • STM32:RTthread_线程
    1微处理器系统    随着产品功能的增多,裸机系统不能够满足产品需求,引入RTOS实时操作系统的多线程管理,可以增加程序的稳定性逻辑性,便于管理;2线程  通常默认一个能独立实现功能的函数,称之为线程;多线程管理的意思就是这个程序可以实现多个功能管理;  2.1线程栈   ......
  • Java多线程之---用 CountDownLatch 说明 AQS 的实现原理
    本文基于jdk1.8。CountDownLatch的使用前面的文章中说到了volatile以及用volatile来实现自旋锁,例如java.util.concurrent.atomic包下的工具类。但是volatile的使用场景毕竟有限,很多的情况下并不是适用,这个时候就需要synchronized或者各种锁实现了。今天就来说一下几......
  • Java 中的几种线程池,你之前用对了吗
    好久不发文章了,难道是因为忙,其实是因为懒。这是一篇关于线程池使用和基本原理的科普水文,如果你经常用到线程池,不知道你的用法标准不标准,是否有隐藏的OOM风险。不经常用线程池的同学,还有对几种线程的使用不甚了解的同学可以读一下此文。为什么要使用线程池虽然大家应该都已经很清......
  • C# 多线程
    首先要关注电脑配置是否是多核多CPU的。因为一个CPU在同一时刻只能运行一个线程,但是多个CPU在同一时刻就可以运行多个线程。 多线程的优点:1、可以同时完成多个任务;2、可以使程序的响应速度更快;3、可以让占用大量处理时间的任务或当前没有进行处理的任务定期将处理时间让给......
  • 多线程读写文件
    参考:实践1-2:多线程读写文件-l.w.x-博客园(cnblogs.com)得到的结论是,可以多线程读写,但是会有多种情况:多线程同时读同一个文件,在这种情况下并不会造成冲突多线程同时写同一个文件,会造成写数据丢失多线程同时对同一个文件进行写和读,会造成脏读解决办法是加锁,同时......