广州智迅网络做网站/吉林seo关键词
目录
- 一、进程创建
- 1.1 写时拷贝
- 1.2 frok的常规用法
- 1.3 fork调用失败的原因
- 二、进程终止
- 2.1 进程退出码
- 2.2 进程退出方式
- 2.2.1 exit函数的使用
- 2.2.2 _exit函数的使用
- 2.2.3 exit函数与_exit函数的区别
- 2.3 进程信号
- 三、进程等待
- 3.1 进程等待的必要性
- 3.2 进程等待的方式
- 3.2.1 wait函数
- 3.2.2 waitpid函数
- 3.3 获取子进程的状态信息(status)
- 3.4 阻塞等待
- 3.5 非阻塞等待
- 3.6 wait与waitpid的区别
一、进程创建
关于进程创建这个话题其实在之前我们就已经讲的差不多了,利用fork函数从已存在进程中创建一个新进程,新进程为子进程,而原进程为父进程。返回值:自进程中返回0,父进程返回子进程id,出错返回-1。
进程调用fork,当控制转移到内核中的fork代码后,内核做:
- 分配新的内存块和内核数据结构给子进程
- 将父进程部分数据结构内容拷贝至子进程
- 添加子进程到系统进程列表当中
- fork返回,开始调度器调度
fork之前父进程独立执行,fork之后,父子两个执行流分别执行:
1.1 写时拷贝
通常,父子代码共享,父子再不写入时,数据也是共享的,当任意一方试图写入,便以写时拷贝的方式各自一份副本。具体见下图:
1.2 frok的常规用法
- 一个父进程希望复制自己,使父子进程同时执行不同的代码段。例如,父进程等待客户端请求,生成子进程来处理请求。
- 一个进程要执行一个不同的程序。例如子进程从fork返回后,调用exec函数
1.3 fork调用失败的原因
- 系统中有太多的进程
- 实际用户的进程数超过了限制
关于进程的创建使用fork函数我在之前的文章中已经全部讲到,这里就不花太多时间进行讲解了。
二、进程终止
下面我们就来探究一下进程终止正常执行完成与进程异常的情况,我们的重点肯定是要探究结果不正确的原因(因为结果正确了就代表我们一定程度上就完成了某项任务),而结果不正确又可以通过一些方式来进行判断,所以接下来我们将来谈谈退出码。
2.1 进程退出码
进程退出码(exit code)是一个整数,用于表示一个进程在执行完成后的状态。当一个进程完成执行并退出时,它会返回一个退出码,该退出码通常是一个非零整数或者是0。一个非零的退出码通常表示进程执行过程中出现了错误或异常情况,而0则通常表示进程执行成功。进程退出码的范围通常是0到255之间的整数。
我们平时最常见的int main() {return 0;} 退出码为0,我们一般默认这个进程执行成功,而!0表示进程执行过程中出现了错误或异常情况,我们可以知道!0是有很多种情况的,具体的退出码含义因操作系统和应用程序而异。通常,每个应用程序会定义自己的退出码,并在文档中提供退出码的含义说明,例如:1表示找不到该文件 2表示进程创建失败… 每个退出码都对应着解释说明此时进程的执行结果,这也是为了方便后续进程出现某种错误时我们能够快速查找原因!!
下面我们通过一个例子来讲讲这个退出码:
echo $? # 查看最近一次指令的退出码
既然我们的退出码有很多中,下面我们就来见一见这些退出码对应的文档解释,我们将使用strerror这个库函数来进行展示,它能够将退出码转化成对应的退出码信息:
我们的退出码在不同的操作系统中可能数量、解释说明不一致,大家下来可以在不同的操作系统中去查看一下退出码;另外退出码对应的信息也有可能不会严格按照上面的标准打印信息,这跟具体的指令实现有关,我们自己也可以去定义这些退出码对应的信息。
2.2 进程退出方式
进程退出的方式我们在之前已经知道main函数return就是一个典型的进程退出方式,那么我想问其他函数return呢?它是否也代表进程退出?
相信这个答案应该是非常明了的,其他函数return仅仅代表该函数返回到调用该函数处,而main函数return则是真正的进程退出,这其实也说明进程执行本质其实是main执行流执行。
下面我们另外来介绍两种进程退出方式:
- exit函数退出,exit(int status):status就代表进程的退出码,它其实就等价于main函数return xxx,但是它可以在代码的任意位置处调用都表示进程退出。
- _exit函数退出
2.2.1 exit函数的使用
接着我们在其他位置试试去调用exit函数看看会出现什么现象:
结论:exit函数在代码的任意位置被调用都表示该进程退出!!
2.2.2 _exit函数的使用
_exit函数跟exit函数的使用方式一样:
2.2.3 exit函数与_exit函数的区别
我们在上述的例子中可以看到_exit函数与exit函数的使用方式一致,这是否说明它们两者是一样的呢?
其实exit函数内部封装了_exit函数, 但在调用exit之前,还做了其他工作:
- 执行用户通过 atexit或on_exit定义的清理函数。
- 关闭所有打开的流,所有的缓存数据均被写入
- 调用_exit
平时我们也建议一般用exit来终止进程。
2.3 进程信号
当进程异常时,OS会向进程发送终止信号,我们可以通过kill -l查看所有的终止信号:
但是我们发现其中没有0信号,当我们未接收到操作系统发出的信号时此时就为0信号,代表进程正常执行,而这些!0信号就是进程异常时操作系统发出的,这些信号都是宏定义的,我们可以在signum.h中查看:
关于进程信号这里我们不做过多的讲解,我们只是见见它们到了进程信号我再给大家具体讲解每种信号表示的含义。
三、进程等待
3.1 进程等待的必要性
之前讲过,子进程退出,父进程如果不管不顾,就可能造成‘僵尸进程’的问题,进而造成内存泄漏。另外,进程一旦变成僵尸状态,那就刀枪不入,“杀人不眨眼”的kill -9 也无能为力,因为谁也没有办法杀死一个已经死去的进程。最后,父进程派给子进程的任务完成的如何,我们需要知道。如,子进程运行完成,结果对还是不对,或者是否正常退出。
Q:为什么要存在进程等待?
- 回收子进程资源,避免内存泄露
- 获取子进程执行结果
Q:什么是进程等待?
通过系统调用获取子进程退出码或者信号的方式,顺便释放内存问题。
3.2 进程等待的方式
3.2.1 wait函数
wait函数的参数是输出型参数,用来获取子进程退出的状态。如果不关心子进程退出的状态,我们可以设置为 NULL。wait 函数的返回值:成功返回被等待进程的 ID,失败返回 -1。
while :; do ps axj | head -1 && ps ajx | grep mytest | grep -v grep; sleep 1; echo "------------"; done
# 脚本代码,每隔1s监测一下mytest进程的状态
通过观察上述现象,我们发现wait函数确实解决了僵尸进程占用资源的问题,这里我们抛出一个问题:父进程在等待的时候,如果子进程没退出,那么父进程在干什么?
从上述图中我们观察到父进程使用wait函数,我们的父进程确实是一直是处于阻塞状态在等待子进程结束,子进程结束之后它才会执行相应的代码。那么有人会问了上述代码中在子进程结束之后使用了sleep休眠,所以我们的父进程就一直在等待在子进程结束之后它才会结束啊,这说的确实不无道理,但是你去掉sleep之后去检测一下,还是会出现相同的情况即:父进程一直处于阻塞状态等待子进程结束!!
对于这个问题的回答其实是不准确的,因为后面我们要讲的waitpid函数其实是可以通过参数来设置父进程在等待子进程时的状态的,这一点我们在后续会讲到,但是对于父进程调用wait函数来讲,父进程一直处于阻塞状态等待子进程结束这个观点是完全没问题的!!
下面通过这个例子相信大家会对wait函数有一个更深的理解:
Q:父进程使用wait函数等待子进程结束,将子进程的信息返回给父进程后才能执行父进程的代码吗?
是的,父进程使用wait()函数会等待其子进程退出后才会继续执行父进程的代码。wait()函数的作用是使父进程阻塞,直到一个子进程退出为止。当有一个子进程退出时,wait()函数会返回该子进程的进程状态信息。在父进程中调用wait()函数可以避免僵尸进程的产生,同时也可以确保父进程在子进程执行完毕后再继续执行自己的代码。
另外我们还需知道在父进程中调用wait()函数时,如果有多个子进程同时退出,wait()函数会返回其中一个子进程的进程状态信息,而不保证返回哪一个子进程的进程状态信息。如果需要获取所有子进程的退出状态,可以使用waitpid()函数或者wait()函数的循环调用来实现。
关于wait函数的使用我们暂且就讲到这里,因为后续的waitpid才是我们的重点,它比起wait函数更加的灵活、功能也更加丰富!!我们最后也还会讲到它们之间的区别。
3.2.2 waitpid函数
waitpid函数相较于wait更为复杂,但是也更加灵活、功能丰富。
我们先来看看waitpid函数的三个参数:pid参数指定要等待的子进程ID、status参数用于存储子进程退出状态的信息、options参数用于指定等待的行为。
下面对这三个参数进行详细解析:
- pid参数:可以指定要等待的子进程ID。
取值有以下几种:
pid > 0:等待进程ID为pid的子进程结束。
pid == 0:等待与当前进程在同一进程组中的任何子进程结束。
pid == -1:等待任何子进程结束,相当于wait()函数。
pid < -1:等待进程组ID为-pid的任何子进程结束。- status参数:是一个指向整型变量的指针,用于存储子进程的退出状态信息,其中包括退出状态和终止信号等信息。如果不关心退出状态,可以将该参数设置为NULL。
- options参数:是一个整型值,用于指定等待的行为。
可以使用以下选项:
WNOHANG:如果没有已经结束的子进程,则立即返回0而不是等待。
WUNTRACED:如果子进程暂停了,也会返回状态信息。
WCONTINUED:如果子进程被继续了,则返回状态信息。
如果不需要使用任何选项,则可以将该参数设置为0。
waitpid()函数的返回值:
waitpid()函数的返回值为已结束的子进程ID,如果没有已结束的子进程,且没有使用WNOHANG选项,则当前进程会被挂起,直到有一个子进程结束为止。
需要注意的是,waitpid()函数可以多次调用,以等待多个子进程的结束。每次调用可以等待一个指定的子进程,或者等待任意一个子进程。
3.3 获取子进程的状态信息(status)
我们先简单的使用一下waitpid函数来获取子进程的status状态信息:
我们的status其实主要存储着退出状态和进程信号等信息,所以我们此时看到的结果肯定不可能只是一个退出码的结果。对于status这个整数,我们不能将它看做一个完整的整数,而应该看做位图,位图是一种用一个或多个bit位来表示某种状态的一种数据结构,换句话说其实status它其实是按照区域来划分的一个数据。
status的高16位全为0,因为我们的退出状态一般为0~255用一个字节即可表示,而进程信号只有64种使用一个字节完全就能表示了,所以我们的低16位就用来表示退出状态和进程信号,当然其实还有一个bit位是core dump标志,实际上进程信号是用低7位来进行表示的。
我们来看看status使用运算符提取出退出状态和进程信号的方式:
但实际上我们通常是使用两个宏函数来获取子进程的status状态信息:
WEXITSTATUS()宏可以从waitpid()返回的状态信息中提取子进程的退出状态
WIFEXITED()宏可以检查子进程是否正常退出。
在获取到子进程的退出状态和进程信号后,我们就能对子进程的执行结果进行判断了,下面是关于退出状态与进程信号之间的关系。
结论:本质上进程信号决定了退出状态是否有意义!!
下面我们来看看进程异常的情况:
通过上图查看我们的status就能快速判断出进程的问题所在了。
我们知道父进程可以使用waitpid等待子进程结束去获取子进程的状态信息,那么这个过程是怎么样的呢?
3.4 阻塞等待
我们继续来谈前面抛出的问题:父进程在等待的时候,如果子进程没退出,那么父进程在干什么?
阻塞等待:子进程没有退出前,父进程一直在等待子进程退出,不执行其他代码,这种等待就是阻塞等待。
3.5 非阻塞等待
非阻塞等待:就算子进程没退出,父进程也不会一直等待子进程退出,期间父进程会去执行它的代码,过一段时间再来看子进程是否退出,这种等待就是非阻塞等待。父进程每次检查子进程是否退出都是一次非阻塞等待,多次非阻塞等待就是轮询的过程。
下面我们先来通过一个小故事感性理解一下阻塞等待和非阻塞等待:
小库和阿耶莎是一对情侣,这一天他们约好了在某个地方会合下午4点去xxx饭店吃饭,小库到了集合地点之后给阿耶莎打电话问他到了没,阿耶莎说再等等她她马上就好了,于是小库没挂断就一直站在那儿静静等待着阿耶莎的到来。另外一种场景是小库到达集合地点给阿耶莎打电话问他到了没,阿耶莎说还没呢你再等等,于是小库就挂断电话,想着阿耶莎还没到我可以先给她点一杯奶茶,在她到达时看见我手中的奶茶,想必我们关系更能加深一步~在点完奶茶之后,小库再次打电话给阿耶莎问她到了没,此时阿耶莎说还没呢路上出了一点小问题你再等等吧,于是小库又挂断了电话,他想阿耶莎还没来我可以先买束花在这里等着她,到时候阿耶莎看到之后应该会非常开心吧,小库不愧是舔中之王啊~ 在买完花之后,小库再次给阿耶莎打了一个电话,阿耶莎说她到了,于是小库拿着花返回集合地点。
上述故事中小库就对应父进程,阿耶莎就对应子进程,打电话就相当于系统调用waitpid,阻塞等待就是第一种情形:小库一直没挂电话等待阿耶莎到达目的地;第二种情形:小库在等待阿耶莎期间去做其他的事情就是非阻塞等待,打电话给他然后挂断电话本质上就对阿耶莎做了一次状态检测!小库打了很多次电话询问阿耶莎就是做了很多次检测,这个过程叫做非阻塞轮询。
下面我们就来模拟一下非阻塞等待的情形:
WNOHANG: 若pid指定的子进程没有结束,则waitpid()函数返回0,父进程不予以等待,可以执行它相应的任务。若正常结束,则返回该子进程的ID。
3.6 wait与waitpid的区别
从本质上讲,wait和waitpid的作用是完全相同的都是用于等待子进程结束的系统调用,但是waitpid多了两个参数,从而使我们的编程能更加的灵活。
- 等待的进程不同:wait() 等待任意一个子进程结束,而 waitpid() 可以指定等待某个特定的子进程结束。
- 非阻塞等待:在 wait() 中,父进程会一直等待,直到任意一个子进程结束,如果没有子进程结束,则父进程会一直阻塞。而 waitpid() 可以通过 WNOHANG 选项实现非阻塞等待,即如果指定的子进程还没有结束,则立即返回,而不会阻塞等待。
- 灵活性:由于 waitpid() 可以指定等待某个特定的子进程结束,并且可以进行非阻塞等待,因此它比 wait() 更灵活,更适合需要精细控制的情况。
总的来说,wait() 和 waitpid() 的主要区别在于等待的进程、参数和阻塞等待的方式。根据具体的情况选择使用哪个函数会更加合适。
本篇文章的内容就到这里了,如果有任何疑问或者错处欢迎大家评论区相互交流orz~🙈🙈
相关文章:

【Linux】进程创建进程终止进程等待
目录 一、进程创建1.1 写时拷贝1.2 frok的常规用法1.3 fork调用失败的原因 二、进程终止2.1 进程退出码2.2 进程退出方式2.2.1 exit函数的使用2.2.2 _exit函数的使用2.2.3 exit函数与_exit函数的区别 2.3 进程信号 三、进程等待3.1 进程等待的必要性3.2 进程等待的方式3.2.1 wa…...

编程的进阶和并发之路
编程的进阶和并发之路 博主在这谈并发,是因为单进程的资源是全局共享,函数作为局部空间来分担分布式计算的过程,掌握并发等于熟悉流式计算和程序执行的通量快速到达结束点。在大数据初期阶段,经验开发缺乏很多模拟数据࿰…...

文件系统 --- 文件结构体,文件fd以及文件描述符表
序言 在编程的世界里,文件操作是不可或缺的一部分。无论是数据的持久化存储、日志记录,还是简单的文本编辑,文件都扮演着至关重要的角色。然而,当我们通过编程语言如 C、Java 等轻松地进行文件读写时,背后隐藏的复杂机…...

【第三节】python中的函数
目录 一、函数的定义 二、函数的调用 三、函数的参数 3.1 可变与不可变对象 3.2 函数参数传递 3.3 参数类型 四、匿名函数 五、函数的return语句 六、作用域 七、python的模块化 八、 main 函数 一、函数的定义 函数是经过精心组织、可重复使用的代码片段࿰…...

“论云原生架构及其应用”写作框架软考高级论文系统架构设计师论文
论文真题 近年来,随着数字化转型不断深入,科技创新与业务发展不断融合,各行各业正在从大工业时代的固化范式进化成面向创新型组织与灵活型业务的崭新模式。在这一背景下,以容器和微服务架构为代表的云原生技术作为云计算服务的新…...

深度剖析Google黑科技RB-Modulation:告别繁琐训练,拥抱无限创意生成和风格迁移!
给定单个参考图像,RB-Modulation提供了一个无需训练的即插即用解决方案,用于(a)风格化和(b)具有各种提示的内容样式组合,同时保持样本多样性和提示对齐。例如,给定参考样式图像(例如“熔化的黄金3d渲染样式”)和内容图像(例如(a)“狗”),RB-Modulation方法可以坚持所需的提…...

react native 和 flutter 区别
React Native 和 Flutter 都是用于构建跨平台移动应用的优秀框架,各有其优点和适用场景。 1. React Native 1.1 优点 | 基于 JavaScript 生态:对于熟悉 JavaScript 和 React 的开发者来说,学习成本相对较低,能够利用大量现有的 …...

ITSS服务经理/ITSS服务工程师,招投标需要准备吗?
信息技术服务标准(ITSS)是中国首套完整的信息技术服务标准体系,全面规定了IT服务产品及其组成要素的标准化实施,旨在提供可信赖的IT服务。 在国际竞争日益激烈的背景下,推动国内标准的国际化已成为广泛共识࿰…...

eleven接口、多态
能够写出接口的定义格式 public interface 接口名 { public static final 数据类型 名称 数据值; //抽象方法: 必须使用实现类对象调用 void method(); //默认方法: 必须使用实现类对象调用 public default void show() {...} …...

重磅惊喜!OpenAI突然上线GPT-4o超长输出模型!「Her」高级语音模式已开放测试
在最近的大模型战争中,OpenAI似乎很难维持霸主地位。虽然没有具体的数据统计,但Claude3.5出现后,只是看网友们的评论,就能感觉到OpenAI订阅用户的流失: Claude3.5比GPT-4o好用,为什么我们不去订阅Claude呢&…...

解决问题 CUDA error: CUBLAS_STATUS_INVALID_VALUE when calling `cublasGemmEx
遇到问题如下: Traceback (most recent call last):File "run_warmup_a.py", line 431, in <module>main()File "run_warmup_a.py", line 142, in mainreturn main_worker(args, logger)File "run_warmup_a.py", line 207, in…...
【Python实战因果推断】67_图因果模型2
目录 Are Consultants Worth It? Crash Course in Graphical Models Chains Are Consultants Worth It? 为了展示有向无环图(DAG)的力量,让我们考虑一个更有趣但处理因素并未随机化的情况。假设你是某公司的经理,正在考虑是否聘请顶级咨询顾问。你…...

RK3588+MIPI+GMSL+AI摄像机:自动车载4/8通道GMSL采集/边缘计算盒解决方案
RK3588作为目前市面能买到的最强国产SOC,有强大的硬件配置。在智能汽车飞速发展,对图像数据矿场要求越来越多的环境下,如何高效采集数据,或者运行AI应用,成为刚需。 推出的4/8通道GMSL采集/边缘计算盒产品满足这些需求…...

智云-一个抓取web流量的轻量级蜜罐
智云-一个抓取web流量的轻量级蜜罐 安装环境要求 apache php7.4 mysql8 github地址 https://github.com/xiaoxiaoranxxx/POT-ZHIYUN 系统演示...

面向对象程序设计之sort排序
目录 java 升序 降序 c# 升序 倒序 小结 敲过排序算法的都会的,Sort排序与compareTo的改写。 java 升序 一般自带的sort方法就是升序的。 Arrays.sort(arr);//传入要排序的数组,默认升序 Collections.sort(list);//传入要排序的集合类&am…...

ARM学习(29)NXP 双coreMCU MCXN94学习
笔者来介绍一下NXP 双core板子 ,新系列的mcxn94 1、MCX 新系列介绍 恩智浦 MCU 系列产品包括 Kinetis 、LPC 系列,以及 i.MX RT 系列,现在又推出新系列产品 MCX 产品,包括四个系列,目前已经发布产品的是 MCX N 系列。…...

视频剪辑免费素材哪里能找到?
在创作视频时,素材的选择至关重要。为了让您的项目更具吸引力和专业性,我整理了8个剪辑必备素材网站,它们提供了丰富多样的资源,从高清视频到优质音乐,应有尽有。让我们一起探索这些资源丰富、质量上乘的平台ÿ…...

多线程为什么是你必需要掌握的知识
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、多线程是什么?二、多线程学习的必要性1.提升代码性能2.更优秀的软件设计和架构3.更好的工作机会 总结 前言 相信每一位开发者,都应…...

转转上门履约服务拆分库表迁移实践
文章目录 1 背景2 数据迁移方案2.1 方案一:双写新旧库2.2 方案二:灰度开关切换新旧库 3 迁移细节3.1 业务代码改造3.2 数据同步3.3 数据一致性校验 4 总结5 参考资料 1 背景 随着业务不断发展,一个服务中部分功能模块适合沉淀下来作为通用的…...

upload-labs 1-19关 攻略 附带项目下载地址 小白也能看会
本文章提供的工具、教程、学习路线等均为原创或互联网收集,旨在提高网络安全技术水平为目的,只做技术研究,谨遵守国家相关法律法规,请勿用于违法用途,如有侵权请联系小编处理。 环境准备: 1.靶场搭建 下…...

如何设置SQL Server的端口:详细步骤指南
如何设置SQL Server的端口:详细步骤指南 在SQL Server中,配置端口是确保数据库服务能够正确通信的重要步骤。无论是为了提高安全性还是满足特定的网络配置需求,正确设置SQL Server的端口都是必要的。本文将详细介绍如何设置SQL Server的端口…...

昇思25天学习打卡营第16天|Diffusion扩散模型,DCGAN生成漫画头像
Diffusion扩散模型 关于扩散模型(Diffusion Models)有很多种理解,本文的介绍是基于denoising diffusion probabilistic model (DDPM),DDPM已经在(无)条件图像/音频/视频生成领域取得…...

【吊打面试官系列-Dubbo面试题】Dubbo SPI 和 Java SPI 区别?
大家好,我是锋哥。今天分享关于 【Dubbo SPI 和 Java SPI 区别?】面试题,希望对大家有帮助; Dubbo SPI 和 Java SPI 区别? JDK SPI JDK 标准的 SPI 会一次性加载所有的扩展实现,如果有的扩展吃实话很耗时&…...

7.31 Day13 网络散记(http,https...)
http固定对应80端口 https固定对应443端口...

LumaLabs 用例和应用分析
介绍 LumaLabs AI 是一家尖端技术公司,通过创新使用人工智能 (AI) 和神经渲染技术,彻底改变了 3D 内容创作领域。本报告深入探讨了 LumaLabs AI 的各种用例和应用,重点介绍了其在不同行业中的能力、优势和潜在影响。 LumaLabs AI 概述 LumaL…...

leetcode88.合并两个有序数组(简单题!)
思路:合并两个数组,再进行排序(利用快速排序) class Solution(object):def quicksort(self, num, i, j):if i>j: # 跳出循环的条件要出来return left iright jtemp num[i]while left < right:while left < right and…...

鸿蒙(HarmonyOS)DatePicker+TimePicker时间选择控件
一、操作环境 操作系统: Windows 11 专业版、IDE:DevEco Studio 3.1.1 Release、SDK:HarmonyOS 3.1.0(API 9) 二、效果图 可实现两种选择方式,可带时分选择,也可不带,使用更加方便。 三、代码 SelectedDateDialog…...

2024年和2025年CFA FRM CAIA ESG自己整理的资料
本人金融女一枚,CFA FRM CAIA ESG已过,研究生学历,职位投资经理。从事金融快5年了,月薪30000,周未双休五险一金。工作很充实也很累,每天失眠,思考了很久,还是决定离职了,…...

AMD第二季度财报:数据中心产品销售激增,接近总收入一半
#### 财报亮点 7月30日,AMD公布了截至6月29日的第二季度财务业绩,利润超过了华尔街的预期。根据TechNews的报道,最值得注意的是,AMD现在近一半的销售额来自于数据中心产品,而非传统的PC芯片、游戏主机或是工业与汽车嵌…...

ThreadLocal详解及ThreadLocal源码分析
提示:ThreadLocal详解、ThreadLocal与synchronized的区别、ThreadLocal的优势、ThreadLocal的内部结构、ThreadLocalMap源码分析、ThreadLocal导致内存泄漏的原因、要避免内存泄漏可以用哪些方式、ThreadLocal怎么解决Hash冲突问题、避免共享的设计模式、ThreadLoca…...