目 录CONTENT

文章目录

第一章 并发编程和上下文

FatFish1
2024-10-21 / 0 评论 / 0 点赞 / 68 阅读 / 0 字 / 正在检测是否收录...

多线程并发的底层本质

不管是单核还是多核,都是支持多线程并发的。

CPU将每个线程分配的时间分片,每个片叫时间片,是CPU分配的最小时间单位,一般是几十毫秒级别。CPU通过不断将时间片分给不同的线程执行,在感官上就是多线程并发

但是在执行下一个时间片切换线程时,会保存上一个任务的状态,以便切换回这个任务时可以再加载这个任务状态,这个保存到加载的过程就是一次上下文切换。

当线程生命周期短(或循环圈数少)的情况下,并发可能还不如串行快,这是因为上下文切换耗时占比显著增多了。

如何减少上下文切换

  • 使用CAS算法。java的Atomic包使用CAS算法,不需要加锁,也不需要做线程切换

  • 减少非必须线程创建

  • 协程:协程在单线程里实现多任务调度,并在单线程里维持多个任务的切换

WAITING线程的分析

使用jstack命令可以dump线程信息

./jstack <pid> > /tmp/dump.txt

统计线程状态

grep java.lang.Thread.State dump.txt | awk ‘{print $2$3$4$5}’ | sort | uniq -c

对于WAITING线程可以看到很多处于on object monitor状态,在Object.wait()暂停的。说明JBOSS线程池里接收到任务的线程太少,大量线程都闲着。可以看下这些闲置线程归属哪一个线程池,找到对应的线程池配置,优化器对应配置即可

其他影响多线程并发能力的点

死锁、资源限制也会影响多线程的并发能力

0

评论区