Java岗大厂面试百日冲刺【Day45】— 实战那些事儿 (日积月累,每日三题)

文章详细讲述了Java开发面试中常见的线程阻塞概念,涉及线程阻塞的原因、不同情况下的线程阻塞如sleep、wait、yield等,以及阻塞与非阻塞的区别。同时提到了面试技巧和注意事项,包括简历准备、基础知识展示和开源项目管理。
摘要由CSDN通过智能技术生成
  • 每日小结

本栏目Java开发岗高频面试题主要出自以下各技术栈:Java基础知识集合容器并发编程JVMSpring全家桶MyBatis等ORMapping框架MySQL数据库Redis缓存RabbitMQ消息队列Linux操作技巧等。

面试题1:什么是线程阻塞?什么情况会导致线程阻塞

=======================================================================================

当线程A在运行一段代码的时,这时候另一个线程B也需要运行,但是在运行过程中的线程A执行完成之前,另一个线程B是无法获取到执行对象锁的,这个时候就会造成线程阻塞

sleep()wait()调用后都会暂停当前线程并让出cpu的执行时间,但不同的是sleep不会释放当前持有的对象的锁资源,到时间后会继续执行,而wait会放弃所有锁并需要notify/notifyAll后重新获取到对象锁资源后才能继续执行

java程序中出现线程阻塞的几种情况:

在这里插入图片描述

1、睡眠状态:

Thread.sleep (long millis)方法,使线程转到阻塞状态。millis参数设定睡眠的时间,以毫秒为单位。当睡眠结束后,就转为就绪(Runnable)状态。sleep()平台移植性好。

2、等待状态:

当一个线程正在运行时调用了wait()方法,此时该线程需要交出CPU执行权,也就是将锁释放出去,交给另一个线程,该线程进入等待状态,但与睡眠状态不一样的是,进入等待状态的线程不需要设置睡眠时间,但是需要执行notify()或者notifyall()来对其唤醒,自己是不会主动醒来的,等被唤醒之后,该线程也会进入就绪状态,但是进入仅需状态的该线程手里是没有执行权的,也就是没有锁,而睡眠状态的线程一旦苏醒,进入就绪状态时是自己还拿着锁的。

3、礼让状态:

Thread.yield() 方法,暂停当前正在执行的线程对象,把执行机会让给相同或者更高优先级的线程。yield() 使得线程放弃当前分得的 CPU 时间,但是不使线程阻塞,即线程仍处于可执行状态,随时可能再次分得 CPU 时间。调用 yield() 的效果等价于调度程序认为该线程已执行了足够的时间从而转到另一个线程。

4、自闭状态:

当一个线程正在运行时,调用了一个join()方法,此时该线程会进入阻塞状态,另一个线程会运行,直到运行结束后,原线程才会进入就绪状态。这个比较像是”走后门“,本来该先把你的事情解决完了再解决后边的人的事情,但是这时候有走后门的人,那就会停止给你解决,而优先把走后门的人事情解决了;

5、suspend() 和 resume() :

两个方法配套使用,suspend()使得线程进入阻塞状态,并且不会自动恢复,必须其对应的resume() 被调用,才能使得线程重新进入可执行状态。

典型地,suspend() 和 resume() 被用在等待另一个线程产生的结果的情形:测试发现结果还没有产生后,让线程阻塞,另一个线程产生了结果后,调用 resume() 使其恢复。Thread中suspend()和resume()两个方法在JDK1.5中已经废除,因为有死锁倾向。

追问1:线程阻塞会导致进程阻塞么?


回答这个问题,我们得了解一下线程模型(下述对应关系为 线程内核调度实体

  • 多对1用户级线程模型

  • 1对1内核级线程模型

  • 多对多两级线程模型

多对1用户级线程模型

在这里插入图片描述

  • 线程的创建、调度、同步,由所属进程的用户空间线程库实现。

  • 用户态线程,对内核几乎是透明的(许多操作不需要内核接管)

  • 但线程总要有一些操作经过内核,比如系统调用。

  • 不需要频繁的内核态/用户态切换,处理速度非常快。

  • 该模式下,当进程的某个线程,系统调用(比如I/O)阻塞时,该进程也会阻塞。

该模式下,进程的所有线程,都对应一个内核调度实体(KES),多对一,并且内核不知道这个进程有哪些线程。KES无法将其他线程,调度到其他处理器上。该进程(所有的线程)被阻塞,直到本次系统调用(比如I/O)结束。

1对1内核级线程模型

在这里插入图片描述

  • 每个用户线程都对应一个的内核调度实体。

  • 内核会对每个线程进行调度,可以调度到其他处理器上。

  • 线程每次操作会在用户态和内核态切换。

  • 线程数量过多时,对系统性能有影响。

多对多两级线程模型

在这里插入图片描述

  • 每个用户线程拥有多个内核调度实体

  • 多个用户线程也可以对应一个内核调度实体

  • 实现该模型非常复杂。

  1. 线程阻塞时,在多对1用户级线程模型下,会导致所属进程阻塞
  1. 在1对1或多对多模型下,不会导致进程阻塞,目前linux基本上都采用一对一模型。

在这里插入图片描述

课间休息,又来秀一下来自咱们群里同学的搬砖工地,坐标:青岛

作者:内蒙古上单


面试题2:怎么理解阻塞和非阻塞

==============================================================================

阻塞和非阻塞关注的是程序在等待调用结果(消息,返回值)时的状态

阻塞调用:指调用结果返回之前,当前线程会被挂起。调用线程只有在得到结果之后才会返回。

非阻塞调用:指在不能立刻得到结果之前,该调用不会阻塞当前线程。

就像领导周末打电话问我能不能去公司加班,我支支吾吾半天领导没听懂我说的啥,如果是阻塞式调用,领导(线程)会把自己挂起,一直追问我直到我告诉他能不能去。
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注Java获取)

img

最后

最后,强调几点:

  • 1. 一定要谨慎对待写在简历上的东西,一定要对简历上的东西非常熟悉。因为一般情况下,面试官都是会根据你的简历来问的; 能有一个上得了台面的项目也非常重要,这很可能是面试官会大量发问的地方,所以在面试之前好好回顾一下自己所做的项目;
  • 2. 和面试官聊基础知识比如设计模式的使用、多线程的使用等等,可以结合具体的项目场景或者是自己在平时是如何使用的;
  • 3. 注意自己开源的Github项目,面试官可能会挖你的Github项目提问;

我个人觉得面试也像是一场全新的征程,失败和胜利都是平常之事。所以,劝各位不要因为面试失败而灰心、丧失斗志。也不要因为面试通过而沾沾自喜,等待你的将是更美好的未来,继续加油!

以上面试专题的答小编案整理成面试文档了,文档里有答案详解,以及其他一些大厂面试题目。

面试答案

三面头条+四面阿里+五面腾讯拿offer分享面经总结,最终入职阿里

三面头条+四面阿里+五面腾讯拿offer分享面经总结,最终入职阿里

三面头条+四面阿里+五面腾讯拿offer分享面经总结,最终入职阿里

《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!
-sApjcyVz-1713443088019)]

[外链图片转存中…(img-PBEtKkhq-1713443088020)]

[外链图片转存中…(img-XkEy7pj2-1713443088021)]

《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!

  • 15
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值