自我介绍,项目介绍,实习单位介绍。
1.项目中遇到的难点以及你是如何解决的
根据实际项目来说
2.实习工作中遇到的难点以及你是如何解决的
根据实习工作来说
3.说一下你对线程池的理解
这里有我自己对线程池这一块内容的总结:一文看透线程池
4.对于单线程和多线程的理解说一下,他们各自的优缺点
单线程在执行时能避免线程上下文切换导致的性能开销,并且没有线程安全问题,能够按照开发者意愿去顺序执行一个任务。同时实现起来比较简单,如果一个任务比较简单,使用单线程是好的。
多线程就是多个线程去工作,如果一个任务比较大,使用多线程在多核心处理器计算机上能更快的处理。但是多线程有可见性问题,线程安全问题,需要开发者去做更多的逻辑保证它能正常执行。
5.为什么会有可见性问题
这是由于Java内存模型的设计决定的,Java整体采用共享内存+线程私有内存实现内存模型。这就倒置某些线程在私有内存中操作共享变量时会对其他线程产生可见性问题。最简单的例子就是共享内存有个int变量i,初值为1,两个线程都对它进行自增操作,但是两个线程都看不到对方对变量i的修改,所以有可能会得到错误的答案。
6.可见性问题是Java的问题还是操作系统与生具有的问题
是操作系统的实现就有可能导致可见性问题。
7.为什么呢
根本原因是cpu的处理速度大于内存的读写速度,于是cpu就会包含多级高速缓存去缓冲两者的速度差,再加上cpu内部的寄存器也可以算是线程私有的。所以线程在高速缓存和寄存器上的操作会对其他线程产生可见性问题。Java运行在操作系统之上,自然也会有可见性问题。
8.那Java是如何解决可见性问题的
其实并不只是多线程的时候会产生可见性问题,cpu对指令的重拍序也会产生可见性问题。Java解决可见性问题主要是通过使用内存屏障强制规定指令的执行顺序来避免可见性问题。对于开发者而已,就体现在锁的使用和volatile关键字的使用上,通过这些语法告诉jvm怎么去加内存屏障。至于内存屏障,它对开发者是透明的。
9.说说计算机网络分层吧,每一层的作用和主要协议
请问是按照7层来说呢,还是4层或者5层。
10.按照5层来说吧
5层划分的话分为物理层,数据链路层,网络层,传输层和应用层。
物理层是最低部的一层,主要是用来传输比特,解决网络中的异构问题。
数据链路层在物理层之上,他的作用主要是把数据封装成帧,实现简单的数据校验功能。
网络层中的主要协议是ip协议,主要是通过ip协议在网络中去寻找ip地址对应的主机。
传输层两大协议是TCP协议和UDP协议,提供了可靠传输和巨量传输两种模式给上层,上层可以通过传输层中的协议进行端到端的数据传输。
应用层是最上面一层,主要是为了适配各式各样应用的网络模块设计,比如浏览器使用http协议和80端口,但其他应用的协议又不同,应用层就是为了不同应用而存在的。
11.如果服务器在运行中cpu突然暴增怎么排查
首先通过ps命令查看一下占用cpu最多的进程,再根据请求选择是否要杀死它还是用其他的解决方案。
然后通过stack工具打印Java的方法栈,查看是否有死锁的存在。
然后通过其他排查工具定位问题所在。如果是数据库连接的的问题,就用回滚策略解决。如果只是单纯的请求量暴增导致的,那么就先重启服务,并在以后的开发中多进行压测。
(ps:这个问题答的不太好)
12.平时看什么书吗?
看啊,今年主要看了《并发编程的艺术》《高性能mysql》《Redis设计与实现》
13.对开源框架有了解吗?
读过Spring的源码,对Spring还是挺了解的。
14.那你说说你在看Spring源码的过程中学习到的点吧
这个根据自己的见解来说吧,我说的是spring容器的设计和aop实现这一块。一定要说出学习到的点。
小结
感觉这次的面试考察的很全面,自己在实际场景处理这一块确实掌握的不太好,下去要好好学习了。祝自己接下来的面试顺利。
本文分享了一次全面的面试经历,涵盖自我介绍、项目难点解析、线程池理解、单多线程优劣、可见性问题根源及Java解决策略、计算机网络五层模型、服务器CPU暴增排查方法、个人阅读推荐及开源框架心得。深入探讨了技术细节与实际场景应对。

1567

被折叠的 条评论
为什么被折叠?



