多线程并发的底层本质
不管是单核还是多核,都是支持多线程并发的。
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线程池里接收到任务的线程太少,大量线程都闲着。可以看下这些闲置线程归属哪一个线程池,找到对应的线程池配置,优化器对应配置即可
其他影响多线程并发能力的点
死锁、资源限制也会影响多线程的并发能力
评论区