网易首页 > 网易号 > 正文 申请入驻

面试官:单核CPU支持Java多线程吗?为什么?被问懵了!

0
分享至

Java精选面试题 (微信小程序): 5000+ 道面试题和选择题, 真实面经 , 简历模版 ,包含Java基础、并发、JVM、线程、MQ系列、Redis、Spring系列、Elasticsearch、Docker、K8s、Flink、Spark、架构设计、大厂真题等,在线随时刷题!

由于现在大多计算机都是多核CPU,多线程往往会比单线程更快,更能够提高并发,但提高并发并不意味着启动更多的线程来执行。更多的线程意味着线程创建销毁开销加大、上下文非常频繁,你的程序反而不能支持更高的TPS。

1. 时间片

多任务系统往往需要同时执行多道作业。作业数往往大于机器的CPU数,然而一颗CPU同时只能执行一项任务,如何让用户感觉这些任务正在同时进行呢? 操作系统的设计者 巧妙地利用了时间片轮转的方式

时间片是CPU分配给各个任务(线程)的时间!

思考:单核CPU为何也支持多线程呢?

线程上下文是指某一时间点 CPU 寄存器和程序计数器的内容,CPU通过时间片分配算法来循环执行任务(线程),因为时间片非常短,所以CPU通过不停地切换线程执行。

换言之,单CPU这么频繁,多核CPU一定程度上可以减少上下文切换。

2. 超线程

现代CPU除了处理器核心之外还包括寄存器、L1L2缓存这些存储设备、浮点运算单元、整数运算单元等一些辅助运算设备以及内部总线等。一个多核的CPU也就是一个CPU上有多个处理器核心,就意味着程序的不同线程需要经常在CPU之间的外部总线上通信,同时还要处理不同CPU之间不同缓存导致数据不一致的问题。

超线程这个概念是Intel提出的,简单来说是在一个CPU上真正的并发两个线程,由于CPU都是分时的(如果两个线程A和B,A正在使用处理器核心,B正在使用缓存或者其他设备,那AB两个线程就可以并发执行,但是如果AB都在访问同一个设备,那就只能等前一个线程执行完后一个线程才能执行)。实现这种并发的原理是 在CPU里加了一个协调辅助核心,根据Intel提供的数据,这样一个设备会使得设备面积增大5%,但是性能提高15%~30%。

3. 上下文切换

  • 线程切换,同一进程中的两个线程之间的切换

  • 进程切换,两个进程之间的切换

  • 模式切换,在给定线程中,用户模式和内核模式的切换

  • 地址空间切换,将虚拟内存切换到物理内存

CPU切换前把当前任务的状态保存下来,以便下次切换回这个任务时可以再次加载这个任务的状态,然后加载下一任务的状态并执行。任务的状态保存及再加载, 这段过程就叫做上下文切换。

每个线程都有一个程序计数器(记录要执行的下一条指令),一组寄存器(保存当前线程的工作变量),堆栈(记录执行历史,其中每一帧保存了一个已经调用但未返回的过程)。

寄存器 是 CPU 内部的数量较少但是速度很快的内存(与之对应的是 CPU 外部相对较慢的 RAM 主内存)。寄存器通过对常用值(通常是运算的中间值)的快速访问来提高计算机程序运行的速度。

程序计数器是一个专用的寄存器,用于表明指令序列中 CPU 正在执行的位置,存的值为正在执行的指令的位置或者下一个将要被执行的指令的位置。

  • 挂起当前任务(线程/进程),将这个任务在 CPU 中的状态(上下文)存储于内存中的某处

  • 恢复一个任务(线程/进程),在内存中检索下一个任务的上下文并将其在 CPU 的寄存器中恢复

  • 跳转到程序计数器所指向的位置(即跳转到任务被中断时的代码行),以恢复该进程在程序中

线程上下文切换会有什么问题呢?

上下文切换会导致额外的开销,常常表现为高并发执行时速度会慢串行,因此减少上下文切换次数便可以提高多线程程序的运行效率。

  • 直接消耗:指的是CPU寄存器需要保存和加载, 系统调度器的代码需要执行, TLB实例需要重新加载, CPU 的pipeline需要刷掉

  • 间接消耗:指的是多核的cache之间得共享数据, 间接消耗对于程序的影响要看线程工作区操作数据的大小

4. 切换查看

Linux系统下可以使用vmstat命令来查看上下文切换的次数, 其中cs列就是指上下文切换的数目(一般情况下, 空闲系统的上下文切换每秒大概在1500以下)

5. 线程调度抢占式调度

指的是每条线程执行的时间、线程的切换都由系统控制,系统控制指的是在系统某种运行机制下,可能每条线程都分同样的执行时间片,也可能是某些线程执行的时间片较长,甚至某些线程得不到执行的时间片。在这种机制下,一个线程的堵塞不会导致整个进程堵塞。

java使用的线程调使用抢占式调度,Java中线程会按优先级分配CPU时间片运行,且优先级越高越优先执行,但优先级高并不代表能独自占用执行时间片,可能是优先级高得到越多的执行时间片,反之,优先级低的分到的执行时间少但不会分配不到执行时间。

协同式调度

指某一线程执行完后主动通知系统切换到另一线程上执行,这种模式就像接力赛一样,一个人跑完自己的路程就把接力棒交接给下一个人,下个人继续往下跑。线程的执行时间由线程本身控制,线程切换可以预知,不存在多线程同步问题,但它有一个致命弱点:如果一个线程编写有问题,运行到一半就一直堵塞,那么可能导致整个系统崩溃。

线程让出cpu的情况

  • 当前运行线程主动放弃CPU,JVM暂时放弃CPU操作(基于时间片轮转调度的JVM操作系统不会让线程永久放弃CPU,或者说放弃本次时间片的执行权),例如调用yield()方法。

  • 当前运行线程因为某些原因进入阻塞状态,例如阻塞在I/O上

  • 当前运行线程结束,即运行完run()方法里面的任务

7. 引起线程上下文切换的因素
  • 当前执行任务(线程)的时间片用完之后,系统CPU正常调度下一个任务

  • 中断处理,在中断处理中,其他程序”打断”了当前正在运行的程序。当CPU接收到中断请求时,会在正在运行的程序和发起中断请求的程序之间进行一次上下文切换。中断分为硬件中断和软件中断,软件中断包括因为IO阻塞、未抢到资源或者用户代码等原因,线程被挂起。

  • 用户态切换,对于一些操作系统,当进行用户态切换时也会进行一次上下文切换,虽然这不是必须的。

  • 多个任务抢占锁资源,在多任务处理中,CPU会在不同程序之间来回切换,每个程序都有相应的处理时间片,CPU在两个时间片的间隔中进行上下文切换

因此优化手段有:
  • 无锁并发编程,多线程处理数据时,可以用一些办法来避免使用锁,如将数据的ID按照Hash取模分段,不同的线程处理不同段的数据

  • CAS算法,Java的Atomic包使用CAS算法来更新数据,而不需要加锁

  • 使用最少线程

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

合理设置线程数目既可以最大化利用CPU,又可以减少线程切换的开销。

  • 高并发,低耗时的情况,建议少线程。

  • 低并发,高耗时的情况:建议多线程。

  • 高并发高耗时,要分析任务类型、增加排队、加大线程数

作者:布道 https://blog.csdn.net/alex_xfboy/article/details/90722654

公众号“Java精选”所发表内容注明来源的,版权归原出处所有(无法查证版权的或者未注明出处的均来自网络,系转载,转载的目的在于传递更多信息,版权属于原作者。如有侵权,请联系,笔者会第一时间删除处理!

最近有很多人问,有没有技术或摸鱼交流群!加入方式很简单,公众号Java精选,回复“加群”,即可入群!在线摸鱼:https://www.yoodb.com/

Java精选面试题(微信小程序):3000+道面试题,包含Java基础、并发、JVM、线程、MQ系列、Redis、Spring系列、Elasticsearch、Docker、K8s、Flink、Spark、架构设计等,在线随时刷题!

特别推荐:专注分享最前沿的技术与资讯,为弯道超车做好准备及各种开源项目与高效率软件的公众号,「大咖笔记」,专注挖掘好东西,非常值得大家关注。点击下方公众号卡片关注

文章有帮助的话,点在看,转发吧!

特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。

Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.

相关推荐
热点推荐
离谱!12人政变夺权,菲律宾参议院一夜变天,77年前判例被翻出来

离谱!12人政变夺权,菲律宾参议院一夜变天,77年前判例被翻出来

锅锅爱历史
2026-06-10 10:55:26
齐达内谈阿根廷逆转:身处逆境创仍造奇迹,只因梅西是真正的传奇

齐达内谈阿根廷逆转:身处逆境创仍造奇迹,只因梅西是真正的传奇

体育闲话说
2026-07-08 08:11:56
周星驰《女足》票房破286万,45明星助阵刘嘉玲惊喜

周星驰《女足》票房破286万,45明星助阵刘嘉玲惊喜

尺素a
2026-07-08 07:56:27
中国导弹炸响全球,北约无心开会,美国强烈抗议,俄方说了公道话

中国导弹炸响全球,北约无心开会,美国强烈抗议,俄方说了公道话

阿芒娱乐说
2026-07-08 14:20:41
《花少8》嘉宾生图路透!网友:好家伙,一个比一个不好惹

《花少8》嘉宾生图路透!网友:好家伙,一个比一个不好惹

星宿影视鸭
2026-07-07 15:16:18
救命稻草断了!俄军撬开乌军老巢,2万栋楼一夜易主,收官战打响

救命稻草断了!俄军撬开乌军老巢,2万栋楼一夜易主,收官战打响

古史青云啊
2026-07-07 09:52:17
于正“看下体”风波仅4天,司晓迪再曝猛料,与鹿晗关系真相大白

于正“看下体”风波仅4天,司晓迪再曝猛料,与鹿晗关系真相大白

她时尚丫
2026-07-06 20:49:54
“又是唐欣”!中国女排香港站首战2-3加拿大,多人不在状态

“又是唐欣”!中国女排香港站首战2-3加拿大,多人不在状态

真理是我亲戚
2026-07-08 23:04:56
隆加里:巴萨接近签下阿德耶米,已经与球员达成协议

隆加里:巴萨接近签下阿德耶米,已经与球员达成协议

懂球帝
2026-07-09 06:59:36
今晚!CCTV5直播中国女排VS乌克兰,朱婷未归,谁能担起强攻重任

今晚!CCTV5直播中国女排VS乌克兰,朱婷未归,谁能担起强攻重任

晚池
2026-07-09 05:41:13
“关注点错了!”高三妈妈晒女儿成年礼服,被劝减肥才是头等大事

“关注点错了!”高三妈妈晒女儿成年礼服,被劝减肥才是头等大事

林林先生
2026-07-07 09:05:03
精准卡点省钱!掘金把他裁掉了!

精准卡点省钱!掘金把他裁掉了!

柚子说球
2026-07-09 10:08:24
曾是上海著名滑稽演员,妻子是我们熟悉的她,如今70岁靠商演谋生

曾是上海著名滑稽演员,妻子是我们熟悉的她,如今70岁靠商演谋生

胡一舸南游y
2026-07-02 14:58:35
1天4个瓜!国外生子、被抓进去、自曝怀双胎、韩红最让人意外

1天4个瓜!国外生子、被抓进去、自曝怀双胎、韩红最让人意外

三石记
2026-06-25 11:54:09
人民日报推荐:不生病的10条铁律,建议收藏

人民日报推荐:不生病的10条铁律,建议收藏

洞见
2026-06-22 09:30:23
国泰航空回应一航班一度失联事件

国泰航空回应一航班一度失联事件

第一财经资讯
2026-07-09 01:11:17
精酿啤酒,正在被自有品牌毁掉

精酿啤酒,正在被自有品牌毁掉

新零售财经
2026-07-07 11:18:03
重大利好!7000 万铁闸誓死加盟曼联!个人条款已全部谈妥

重大利好!7000 万铁闸誓死加盟曼联!个人条款已全部谈妥

一隅非生
2026-07-08 06:50:58
在泰国定居近一年,褪去游客滤镜,才读懂国人很难适应的松弛人生

在泰国定居近一年,褪去游客滤镜,才读懂国人很难适应的松弛人生

老特有话说
2026-07-07 18:06:38
杰弗森:詹姆斯告诉了我他会去哪,但我不能告诉任何人

杰弗森:詹姆斯告诉了我他会去哪,但我不能告诉任何人

懂球帝
2026-07-09 02:52:17
2026-07-09 10:40:49
Java精选
Java精选
一场永远也演不完的戏
1796文章数 3859关注度
往期回顾 全部

科技要闻

字节杀回来了!深度实测Seedream 5.0 Pro

头条要闻

德国华人迷奸案一嫌犯获刑5年:曾用药3次性侵未婚妻

头条要闻

德国华人迷奸案一嫌犯获刑5年:曾用药3次性侵未婚妻

体育要闻

信哈兰德吃小孩,还是信非洲足球会魔法?

娱乐要闻

王宝强新女友现身!网友炸锅!

财经要闻

九部门:支持加快零售业创新发展

汽车要闻

全面超越你的期待 海豹08探店分享

态度原创

旅游
本地
亲子
手机
艺术

旅游要闻

行进中国 | “把西南联大烽火故事讲给更多人听”

本地新闻

万斤西瓜免费吃,来河南顶“瓜瓜”

亲子要闻

有趣的科普

手机要闻

苹果停止老机型iOS签名验证:iPhone 5c、iPad mini降级通道全部封死

艺术要闻

赵之谦『花鸟团扇』

无障碍浏览 进入关怀版