1
0
mirror of https://github.com/Snailclimb/JavaGuide synced 2025-06-16 18:10:13 +08:00

Update 面试必备/美团-基础篇.md

This commit is contained in:
Snailclimb 2018-11-10 20:33:00 +08:00
parent 6d0b2dc7c9
commit bf16c44cf9

View File

@ -1,66 +1,333 @@
### 核心基础知识 ![备战春招/秋招系列】美团面经总结基础篇 (附详解答案)](http://my-blog-to-use.oss-cn-beijing.aliyuncs.com/18-11-10/3586727.jpg)
- [《图解HTTP》](https://book.douban.com/subject/25863515/)(推荐,豆瓣评分 8.1 , 1.6K+人评价): 讲漫画一样的讲HTTP很有意思不会觉得枯燥大概也涵盖也HTTP常见的知识点。因为篇幅问题内容可能不太全面。不过如果不是专门做网络方向研究的小伙伴想研究HTTP相关知识的话读这本书的话应该来说就差不多了。
- [《大话数据结构》](https://book.douban.com/subject/6424904/)(推荐,豆瓣评分 7.9 , 1K+人评价):入门类型的书籍,读起来比较浅显易懂,适合没有数据结构基础或者说数据结构没学好的小伙伴用来入门数据结构。 **系列文章:**
- [《数据结构与算法分析C语言描述》](https://book.douban.com/subject/1139426/)(推荐,豆瓣评分 8.91.6K+人评价):本书是《Data Structures and Algorithm Analysis in C》一书第2版的简体中译本。原书曾被评为20世纪顶尖的30部计算机著作之一作者Mark Allen Weiss在数据结构和算法分析方面卓有建树他的数据结构和算法分析的著作尤其畅销并受到广泛好评已被世界500余所大学用作教材。
- [《算法图解》](https://book.douban.com/subject/26979890/)(推荐,豆瓣评分 8.40.6K+人评价):入门类型的书籍,读起来比较浅显易懂,适合没有算法基础或者说算法没学好的小伙伴用来入门。示例丰富,图文并茂,以让人容易理解的方式阐释了算法.读起来比较快,内容不枯燥! - [【备战春招/秋招系列1】程序员的简历就该这样写](https://mp.weixin.qq.com/s?__biz=MzU4NDQ4MzU5OA==&mid=2247484573&idx=1&sn=8c5965d4a3710d405d8e8cc10c7b0ce5&chksm=fd9852fccaefdbea8dfe0bc40188b7579f1cddb1e8905dc981669a3f21d2a04cadceafa9023f&token=1990180468&lang=zh_CN#rd)
- [《算法 第四版》](https://book.douban.com/subject/10432347/)(推荐,豆瓣评分 9.30.4K+人评价Java语言描述算法领域经典的参考书全面介绍了关于算法和数据结构的必备知识并特别针对排序、搜索、图处理和字符串处理进行了论述。书的内容非常多可以说是Java程序员的必备书籍之一了。 - [【备战春招/秋招系列2】初出茅庐的程序员该如何准备面试](https://mp.weixin.qq.com/s?__biz=MzU4NDQ4MzU5OA==&mid=2247484578&idx=1&sn=eea72d80a2325257f00aaed21d5b226f&chksm=fd9852c3caefdbd52dd8a537cc723ed1509314401b3a669a253ef5bc0360b6fddef48b9c2e94&token=1990180468&lang=zh_CN#rd)
- [【备战春招/秋招系列3】Java程序员必备书单](https://mp.weixin.qq.com/s?__biz=MzU4NDQ4MzU5OA==&mid=2247484592&idx=1&sn=6d9731ce7401be49e97c1af6ed384ecc&chksm=fd9852d1caefdbc720a361ae65a8ad9d53cfb4800b15a7c68cbdc630b313215c6c52e0934ec2&token=1990180468&lang=zh_CN#rd)
这是我总结的美团面经的基础篇,后面还有进阶和终结篇哦!下面只是我从很多份美团面经中总结的在面试中一些常见的问题。不同于个人面经,这份面经具有普适性。每次面试必备的自我介绍、项目介绍这些东西,大家可以自己私下好好思考。我在前面的文章中也提到了应该怎么做自我介绍与项目介绍,详情可以查看这篇文章:[【备战春招/秋招系列2】初出茅庐的程序员该如何准备面试](https://mp.weixin.qq.com/s?__biz=MzU4NDQ4MzU5OA==&mid=2247484578&idx=1&sn=eea72d80a2325257f00aaed21d5b226f&chksm=fd9852c3caefdbd52dd8a537cc723ed1509314401b3a669a253ef5bc0360b6fddef48b9c2e94&token=1990180468&lang=zh_CN#rd)。
### 1. `System.out.println(3 | 9);`输出什么?
正确答案11.
**考察知识点:逻辑运算符与(&&&)或(|和||**
**&&&**
共同点它们都表示运算符的两边都是true时结果为true
不同点: & 表示在运算时两边都会计算,然后再判断;&&表示先运算符号左边的东西然后判断是否为true是true就继续运算右边的然后判断并输出是false就停下来直接输出不会再运行后面的东西。
**|和||**
共同点它们都表示运算符的两边任意一边为true结果为true两边都不是true结果就为false
不同点:| 表示两边都会运算,然后再判断结果;|| 表示先运算符号左边的东西然后判断是否为true是true就停下来直接输出不会再运行后面的东西是false就继续运算右边的然后判断并输出。
**回到本题:**
3 | 9=0011二进制 | 1001二进制=1011二进制=11十进制
### 2. 说一下转发(Forward)和重定向(Redirect)的区别
**转发是服务器行为,重定向是客户端行为。**
**转发Forword** 通过RequestDispatcher对象的`forwardHttpServletRequest request,HttpServletResponse response`方法实现的。`RequestDispatcher` 可以通过`HttpServletRequest``getRequestDispatcher()`方法获得。例如下面的代码就是跳转到 login_success.jsp 页面。
```java
request.getRequestDispatcher("login_success.jsp").forward(request, response);
```
**重定向Redirect** 是利用服务器返回的状态吗来实现的。客户端浏览器请求服务器的时候服务器会返回一个状态码。服务器通过HttpServletRequestResponse的setStatus(int status)方法设置状态码。如果服务器返回301或者302则浏览器会到新的网址重新请求该资源。
1. **从地址栏显示来说:** forward是服务器请求资源,服务器直接访问目标地址的URL,把那个URL的响应内容读取过来,然后把这些内容再发给浏览器.浏览器根本不知道服务器发送的内容从哪里来的,所以它的地址栏还是原来的地址. redirect是服务端根据逻辑,发送一个状态码,告诉浏览器重新去请求那个地址.所以地址栏显示的是新的URL.
2. **从数据共享来说:** forward:转发页面和转发到的页面可以共享request里面的数据. redirect:不能共享数据.
3. **从运用地方来说:** forward:一般用于用户登陆的时候,根据角色转发到相应的模块. redirect:一般用于用户注销登陆时返回主页面和跳转到其它的网站等
4. **从效率来说:** forward:高. redirect:低.
### 3. 在浏览器中输入url地址 ->> 显示主页的过程,整个过程会使用哪些协议
图解图片来源《图解HTTP》
![状态码](https://user-gold-cdn.xitu.io/2018/4/19/162db5e985aabdbe?imageView2/0/w/1280/h/960/format/webp/ignore-error/1)
总体来说分为以下几个过程:
1. DNS解析
2. TCP连接
3. 发送HTTP请求
4. 服务器处理请求并返回HTTP报文
5. 浏览器解析渲染页面
6. 连接结束
具体可以参考下面这篇文章:
- [https://segmentfault.com/a/1190000006879700](https://segmentfault.com/a/1190000006879700)
### 4. TCP 三次握手和四次挥手
为了准确无误地把数据送达目标处TCP协议采用了三次握手策略。
**漫画图解:**
图片来源《图解HTTP》
![TCP三次握手](https://user-gold-cdn.xitu.io/2018/5/8/1633e127396541f1?w=864&h=439&f=png&s=226095)
**简单示意图:**
![TCP三次握手](https://user-gold-cdn.xitu.io/2018/5/8/1633e14233d95972?w=542&h=427&f=jpeg&s=15088)
- 客户端–发送带有 SYN 标志的数据包–一次握手–服务端
- 服务端–发送带有 SYN/ACK 标志的数据包–二次握手–客户端
- 客户端–发送带有带有 ACK 标志的数据包–三次握手–服务端
#### 为什么要三次握手
**三次握手的目的是建立可靠的通信信道,说到通讯,简单来说就是数据的发送与接收,而三次握手最主要的目的就是双方确认自己与对方的发送与接收是正常的。**
第一次握手Client 什么都不能确认Server 确认了对方发送正常,自己接收正常。
第二次握手Client 确认了自己发送、接收正常对方发送、接收正常Server 确认了:自己接收正常,对方发送正常
第三次握手Client 确认了自己发送、接收正常对方发送、接收正常Server 确认了:自己发送、接收正常,对方发送接收正常
所以三次握手就能确认双发收发功能都正常,缺一不可。
#### 为什么要传回 SYN
接收端传回发送端所发送的 SYN 是为了告诉发送端,我接收到的信息确实就是你所发送的信号了。
> SYN 是 TCP/IP 建立连接时使用的握手信号。在客户机和服务器之间建立正常的 TCP 网络连接时,客户机首先发出一个 SYN 消息,服务器使用 SYN-ACK 应答表示接收到了这个消息,最后客户机再以 ACK(Acknowledgement[汉译:确认字符 ,在数据通信传输中,接收站发给发送站的一种传输控制字符。它表示确认发来的数据已经接受无误。 ]消息响应。这样在客户机和服务器之间才能建立起可靠的TCP连接数据才可以在客户机和服务器之间传递。
#### 传了 SYN,为啥还要传 ACK
双方通信无误必须是两者互相发送信息都无误。传了 SYN证明发送方主动关闭方到接收方被动关闭方的通道没有问题但是接收方到发送方的通道还需要 ACK 信号来进行验证。
![TCP四次挥手](https://user-gold-cdn.xitu.io/2018/5/8/1633e1676e2ac0a3?w=500&h=340&f=jpeg&s=13406)
断开一个 TCP 连接则需要“四次挥手”:
- 客户端-发送一个 FIN用来关闭客户端到服务器的数据传送
- 服务器-收到这个 FIN它发回一 个 ACK确认序号为收到的序号加1 。和 SYN 一样,一个 FIN 将占用一个序号
- 服务器-关闭与客户端的连接发送一个FIN给客户端
- 客户端-发回 ACK 报文确认并将确认序号设置为收到序号加1
#### 为什么要四次挥手
任何一方都可以在数据传送结束后发出连接释放的通知待对方确认后进入半关闭状态。当另一方也没有数据再发送的时候则发出连接释放通知对方确认后就完全关闭了TCP连接。
举个例子A 和 B 打电话通话即将结束后A 说“我没啥要说的了”B回答“我知道了”但是 B 可能还会有要说的话A 不能要求 B 跟着自己的节奏结束通话,于是 B 可能又巴拉巴拉说了一通,最后 B 说“我说完了”A 回答“知道了”,这样通话才算结束。
上面讲的比较概括,推荐一篇讲的比较细致的文章:[https://blog.csdn.net/qzcsu/article/details/72861891](https://blog.csdn.net/qzcsu/article/details/72861891)
### 5. IP地址与MAC地址的区别
### Java相关 参考:[https://blog.csdn.net/guoweimelon/article/details/50858597](https://blog.csdn.net/guoweimelon/article/details/50858597)
- [《Effective java 》](https://book.douban.com/subject/3360807/)(推荐,豆瓣评分 9.01.4K+人评价本书介绍了在Java编程中78条极具实用价值的经验规则这些经验规则涵盖了大多数开发人员每天所面临的问题的解决方案。通过对Java平台设计专家所使用的技术的全面描述揭示了应该做什么不应该做什么才能产生清晰、健壮和高效的代码。本书中的每条规则都以简短、独立的小文章形式出现并通过例子代码加以进一步说明。本书内容全面结构清晰讲解详细。可作为技术人员的参考用书。 IP地址是指互联网协议地址Internet Protocol AddressIP Address的缩写。IP地址是IP协议提供的一种统一的地址格式它为互联网上的每一个网络和每一台主机分配一个逻辑地址以此来屏蔽物理地址的差异。
- [《Head First Java.第二版》](https://book.douban.com/subject/2000732/)(推荐,豆瓣评分 8.71.0K+人评价) 可以说是我的Java启蒙书籍了特别适合新手读当然也适合我们用来温故Java知识点。
- [《Java多线程编程核心技术》](https://book.douban.com/subject/26555197/) Java多线程入门级书籍还不错但是说实话质量不是很高很快就可以阅读完。
- [《JAVA网络编程 第4版》](https://book.douban.com/subject/26259017/) 可以系统的学习一下网络的一些概念以及网络编程在Java中的使用。
- [《Java核心技术卷1+卷2》](https://book.douban.com/subject/25762168/)(推荐): 很棒的两本书建议有点Java基础之后再读介绍的还是比较深入的非常推荐。这两本书我一般也会用来巩固知识点是两本适合放在自己身边的好书。
- [《Java编程思想(第4版)》](https://book.douban.com/subject/2130190/)(推荐,豆瓣评分 9.13.2K+人评价这本书要常读初学者可以快速概览中等程序员可以深入看看java老鸟还可以用之回顾java的体系。这本书之所以厉害因为它在无形中整合了设计模式这本书之所以难读也恰恰在于他对设计模式的整合是无形的。
- [《Java并发编程的艺术》](https://book.douban.com/subject/26591326/)(推荐,豆瓣评分 7.20.2K+人评价): 这本书不是很适合作为Java并发入门书籍需要具备一定的JVM基础。我感觉有些东西讲的还是挺深入的推荐阅读。
- [《实战Java高并发程序设计》](https://book.douban.com/subject/26663605/)(推荐):豆瓣评分 8.3 ,书的质量没的说,推荐大家好好看一下。
- [《Java程序员修炼之道》](https://book.douban.com/subject/24841235/) 很杂,我只看了前面几章,不太推荐阅读。
- [《深入理解Java虚拟机第2版周志明》](https://book.douban.com/subject/24722612/)(推荐,豆瓣评分 8.91.0K+人评价建议多刷几遍书中的所有知识点可以通过JAVA运行时区域和JAVA的内存模型与线程两个大模块罗列完全。
- [《Netty实战》](https://book.douban.com/subject/27038538/)(推荐,豆瓣评分 7.892人评价内容很细如果想学Netty的话推荐阅读这本书
- [《从Paxos到Zookeeper》](https://book.douban.com/subject/26292004/)(推荐,豆瓣评分 7.80.3K人评价简要介绍几种典型的分布式一致性协议以及解决分布式一致性问题的思路其中重点讲解了Paxos和ZAB协议。同时本书深入介绍了分布式一致性问题的工业解决方案——ZooKeeper并着重向读者展示这一分布式协调框架的使用方法、内部实现及运维技巧旨在帮助读者全面了解ZooKeeper并更好地使用和运维ZooKeeper。
### JavaWeb相关
- [《深入分析Java Web技术内幕》](https://book.douban.com/subject/25953851/) 感觉还行,涉及的东西也蛮多。
- [《Spring实战第4版](https://book.douban.com/subject/26767354/)(推荐,豆瓣评分 8.3
0.3K+人评价不建议当做入门书籍读入门的话可以找点国人的书或者视频看。这本定位就相当于是关于Spring的新华字典只有一些基本概念的介绍和示例涵盖了Spring的各个方面但都不够深入。就像作者在最后一页写的那样“学习Spring这才刚刚开始”。
- [《Java Web整合开发王者归来》](https://book.douban.com/subject/4189495/)(已过时):当时刚开始学的时候就是开的这本书,基本上是完完整整的看完了。不过,我不是很推荐大家看。这本书比较老了,里面很多东西都已经算是过时了。不过,这本书的一个很大优点是:基础知识点概括全面。
- [《Redis实战》](https://book.douban.com/subject/26612779/)如果你想了解Redis的一些概念性知识的话这本书真的非常不错。
- [《Redis设计与实现》](https://book.douban.com/subject/25900156/)(推荐,豆瓣评分 8.50.5K+人评价)
- [《深入剖析Tomcat》](https://book.douban.com/subject/10426640/)(推荐,豆瓣评分 8.40.2K+人评价本书深入剖析Tomcat 4和Tomcat 5中的每个组件并揭示其内部工作原理。通过学习本书你将可以自行开发Tomcat组件或者扩展已有的组件。 读完这本书,基本可以摆脱背诵面试题的尴尬。
- [《高性能MySQL》](https://book.douban.com/subject/23008813/)(推荐,豆瓣评分 9.30.4K+人评价mysql 领域的经典之作拥有广泛的影响力。不但适合数据库管理员dba阅读也适合开发人员参考学习。不管是数据库新手还是专家相信都能从本书有所收获。
- [深入理解Nginx第2版](https://book.douban.com/subject/26745255/):作者讲的非常细致,注释都写的都很工整,对于 Nginx 的开发人员非常有帮助。优点是细致,缺点是过于细致,到处都是代码片段,缺少一些抽象。
- [《RabbitMQ实战指南》](https://book.douban.com/subject/27591386/)《RabbitMQ实战指南》从消息中间件的概念和RabbitMQ的历史切入主要阐述RabbitMQ的安装、使用、配置、管理、运维、原理、扩展等方面的细节。如果你想浅尝RabbitMQ的使用这本书是你最好的选择如果你想深入RabbitMQ的原理这本书也是你最好的选择总之如果你想玩转RabbitMQ这本书一定是最值得看的书之一
- [《Spring Cloud微服务实战》](https://book.douban.com/subject/27025912/)从时下流行的微服务架构概念出发详细介绍了Spring Cloud针对微服务架构中几大核心要素的解决方案和基础组件。对于各个组件的介绍《Spring Cloud微服务实战》主要以示例与源码结合的方式来帮助读者更好地理解这些组件的使用方法以及运行原理。同时在介绍的过程中还包含了作者在实践中所遇到的一些问题和解决思路可供读者在实践中作为参考。
- [《第一本Docker书》](https://book.douban.com/subject/26780404/)Docker入门书籍
### 操作系统
- [《鸟哥的Linux私房菜》](https://book.douban.com/subject/4889838/)(推荐,,豆瓣评分 9.10.3K+人评价本书是最具知名度的Linux入门书《鸟哥的Linux私房菜基础学习篇》的最新版全面而详细地介绍了Linux操作系统。全书分为5个部分第一部分着重说明Linux的起源及功能如何规划和安装Linux主机第二部分介绍Linux的文件系统、文件、目录与磁盘的管理第三部分介绍文字模式接口 shell和管理系统的好帮手shell脚本另外还介绍了文字编辑器vi和vim的使用方法第四部分介绍了对于系统安全非常重要的Linux账号的管理以及主机系统与程序的管理如查看进程、任务分配和作业管理第五部分介绍了系统管理员(root)的管理事项,如了解系统运行状况、系统服务,针对登录文件进行解析,对系统进行备份以及核心的管理等。
### 架构相关
- [《大型网站技术架构:核心原理与案例分析+李智慧》](https://book.douban.com/subject/25723064/)(推荐):这本书我读过,基本不需要你有什么基础啊~读起来特别轻松但是却可以学到很多东西非常推荐了。另外我写过这本书的思维导图关注我的微信公众号“Java面试通关手册”回复“大型网站技术架构”即可领取思维导图。
- [《亿级流量网站架构核心技术》](https://book.douban.com/subject/26999243/)(推荐):一书总结并梳理了亿级流量网站高可用和高并发原则,通过实例详细介绍了如何落地这些原则。本书分为四部分:概述、高可用原则、高并发原则、案例实战。从负载均衡、限流、降级、隔离、超时与重试、回滚机制、压测与预案、缓存、池化、异步化、扩容、队列等多方面详细介绍了亿级流量网站的架构核心技术,让读者看后能快速运用到实践项目中。
- [《架构解密从分布式到微服务Leaderus著](https://book.douban.com/subject/27081188/):很一般的书籍,我就是当做课后图书来阅读的。
### 代码优化
- [《重构_改善既有代码的设计》](https://book.douban.com/subject/4262627/)(推荐):豆瓣 9.1 分,重构书籍的开山鼻祖。
### 课外书籍
- 《追风筝的人》(推荐)
- 《穆斯林的葬礼》 (推荐)
- 《三体》 (推荐)
- 《活着——余华》 (推荐)
MAC 地址又称为物理地址、硬件地址用来定义网络设备的位置。网卡的物理地址通常是由网卡生产厂家写入网卡的具有全球唯一性。MAC地址用于在网络中唯一标示一个网卡一台电脑会有一或多个网卡每个网卡都需要有一个唯一的MAC地址。
### 6. HTTP请求、响应报文格式
HTTP请求报文主要由请求行、请求头部、请求正文3部分组成
HTTP响应报文主要由状态行、响应头部、响应正文3部分组成
详细内容可以参考:[https://blog.csdn.net/a19881029/article/details/14002273](https://blog.csdn.net/a19881029/article/details/14002273)
### 7. 为什么要使用索引索引这么多优点为什么不对表中的每一个列创建一个索引呢索引是如何提高查询速度的说一下使用索引的注意事项Mysql索引主要使用的两种数据结构什么是覆盖索引?
**为什么要使用索引?**
1. 通过创建唯一性索引,可以保证数据库表中每一行数据的唯一性。
2. 可以大大加快 数据的检索速度(大大减少的检索的数据量), 这也是创建索引的最主要的原因。
3. 帮助服务器避免排序和临时表
4. 将随机IO变为顺序IO
5. 可以加速表和表之间的连接,特别是在实现数据的参考完整性方面特别有意义。
**索引这么多优点,为什么不对表中的每一个列创建一个索引呢?**
1. 当对表中的数据进行增加、删除和修改的时候,索引也要动态的维护,这样就降低了数据的维护速度。
2. 索引需要占物理空间,除了数据表占数据空间之外,每一个索引还要占一定的物理空间,如果要建立聚簇索引,那么需要的空间就会更大。
3. 创建索引和维护索引要耗费时间,这种时间随着数据量的增加而增加。
**索引是如何提高查询速度的?**
将无序的数据变成相对有序的数据(就像查目录一样)
**说一下使用索引的注意事项**
1. 避免 where 子句中对宇段施加函数,这会造成无法命中索引。
2. 在使用InnoDB时使用与业务无关的自增主键作为主键即使用逻辑主键而不要使用业务主键。
3. 将打算加索引的列设置为 NOT NULL ,否则将导致引擎放弃使用索引而进行全表扫描
4. 删除长期未使用的索引,不用的索引的存在会造成不必要的性能损耗 MySQL 5.7 可以通过查询 sys 库的 chema_unused_indexes 视图来查询哪些索引从未被使用
5. 在使用 limit offset 查询缓慢时,可以借助索引来提高性能
**Mysql索引主要使用的哪两种数据结构**
- 哈希索引对于哈希索引来说底层的数据结构就是哈希表因此在绝大多数需求为单条记录查询的时候可以选择哈希索引查询性能最快其余大部分场景建议选择BTree索引。
- BTree索引Mysql的BTree索引使用的是B树中的B+Tree。但对于主要的两种存储引擎MyISAM和InnoDB的实现方式是不同的。
更多关于索引的内容可以查看我的这篇文章:[【思维导图-索引篇】搞定数据库索引就是这么简单](https://mp.weixin.qq.com/s?__biz=MzU4NDQ4MzU5OA==&mid=2247484486&idx=1&sn=215450f11e042bca8a58eac9f4a97686&chksm=fd985227caefdb3117b8375f150676f5824aa20d1ebfdbcfb93ff06e23e26efbafae6cf6b48e&token=1990180468&lang=zh_CN#rd)
**什么是覆盖索引?**
如果一个索引包含(或者说覆盖)所有需要查询的字段的值,我们就称
之为“覆盖索引”。我们知道在InnoDB存储引擎中如果不是主键索引叶子节点存储的是主键+列值。最终还是要“回表”,也就是要通过主键再查找一次,这样就会比较慢。覆盖索引就是把要查询出的列和索引是对应的,不做回表操作!
### 8. 进程与线程的区别是什么?进程间的几种通信方式说一下?线程间的几种通信方式知道不?
**进程与线程的区别是什么?**
线程与进程相似,但线程是一个比进程更小的执行单位。一个进程在其执行的过程中可以产生多个线程。与进程不同的是同类的多个线程共享同一块内存空间和一组系统资源,所以系统在产生一个线程,或是在各个线程之间作切换工作时,负担要比进程小得多,也正因为如此,线程也被称为轻量级进程。另外,也正是因为共享资源,所以线程中执行时一般都要进行同步和互斥。总的来说,进程和线程的主要差别在于它们是不同的操作系统资源管理方式。
**进程间的几种通信方式说一下?**
1. **管道pipe**管道是一种半双工的通信方式数据只能单向流动而且只能在具有血缘关系的进程间使用。进程的血缘关系通常指父子进程关系。管道分为pipe无名管道和fifo命名管道两种有名管道也是半双工的通信方式但是它允许无亲缘关系进程间通信。
2. **信号量semophore**:信号量是一个计数器,可以用来控制多个进程对共享资源的访问。它通常作为一种锁机制,防止某进程正在访问共享资源时,其他进程也访问该资源。因此,主要作为进程间以及同一进程内不同线程之间的同步手段。
4. **消息队列message queue**:消息队列是由消息组成的链表,存放在内核中 并由消息队列标识符标识。消息队列克服了信号传递信息少,管道只能承载无格式字节流以及缓冲区大小受限等缺点。消息队列与管道通信相比,其优势是对每个消息指定特定的消息类型,接收的时候不需要按照队列次序,而是可以根据自定义条件接收特定类型的消息。
5. **信号signal**:信号是一种比较复杂的通信方式,用于通知接收进程某一事件已经发生。
6. **共享内存shared memory**共享内存就是映射一段能被其他进程所访问的内存这段共享内存由一个进程创建但多个进程都可以访问共享内存是最快的IPC方式它是针对其他进程间的通信方式运行效率低而专门设计的。它往往与其他通信机制如信号量配合使用来实现进程间的同步和通信。
7. **套接字socket**:套接口也是一种进程间的通信机制,与其他通信机制不同的是它可以用于不同及其间的进程通信。
**线程间的几种通信方式知道不?**
1、锁机制
- 互斥锁:提供了以排它方式阻止数据结构被并发修改的方法。
- 读写锁:允许多个线程同时读共享数据,而对写操作互斥。
- 条件变量:可以以原子的方式阻塞进程,直到某个特定条件为真为止。对条件测试是在互斥锁的保护下进行的。条件变量始终与互斥锁一起使用。
2、信号量机制包括无名线程信号量与有名线程信号量
3、信号机制类似于进程间的信号处理。
线程间通信的主要目的是用于线程同步,所以线程没有象进程通信中用于数据交换的通信机制。
### 9. 为什么要用单例模式?手写几种线程安全的单例模式?
**简单来说使用单例模式可以带来下面几个好处:**
- 对于频繁使用的对象,可以省略创建对象所花费的时间,这对于那些重量级对象而言,是非常可观的一笔系统开销;
- 由于 new 操作的次数减少,因而对系统内存的使用频率也会降低,这将减轻 GC 压力,缩短 GC 停顿时间。
**懒汉式(双重检查加锁版本)**
```java
public class Singleton {
//volatile保证当uniqueInstance变量被初始化成Singleton实例时多个线程可以正确处理uniqueInstance变量
private volatile static Singleton uniqueInstance;
private Singleton() {
}
public static Singleton getInstance() {
//检查实例,如果不存在,就进入同步代码块
if (uniqueInstance == null) {
//只有第一次才彻底执行这里的代码
synchronized(Singleton.class) {
//进入同步代码块后再检查一次如果仍是null才创建实例
if (uniqueInstance == null) {
uniqueInstance = new Singleton();
}
}
}
return uniqueInstance;
}
}
```
**静态内部类方式**
静态内部实现的单例是懒加载的且线程安全。
只有通过显式调用 getInstance 方法时,才会显式装载 SingletonHolder 类,从而实例化 instance只有第一次使用这个单例的实例的时候才加载同时不会有线程安全问题
```java
public class Singleton {
private static class SingletonHolder {
private static final Singleton INSTANCE = new Singleton();
}
private Singleton (){}
public static final Singleton getInstance() {
return SingletonHolder.INSTANCE;
}
}
```
### 10. 简单介绍一下bean。知道Spring的bean的作用域与生命周期吗
在 Spring 中,那些组成应用程序的主体及由 Spring IOC 容器所管理的对象,被称之为 bean。简单地讲bean 就是由 IOC 容器初始化、装配及管理的对象除此之外bean 就与应用程序中的其他对象没有什么区别了。而 bean 的定义以及 bean 相互间的依赖关系将通过配置元数据来描述。
Spring中的bean默认都是单例的这些单例Bean在多线程程序下如何保证线程安全呢 例如对于Web应用来说Web容器对于每个用户请求都创建一个单独的Sevlet线程来处理请求引入Spring框架之后每个Action都是单例的那么对于Spring托管的单例Service Bean如何保证其安全呢 Spring的单例是基于BeanFactory也就是Spring容器的单例Bean在此容器内只有一个Java的单例是基于 JVM每个 JVM 内只有一个实例。
![pring的bean的作用域](https://user-gold-cdn.xitu.io/2018/11/10/166fd45773d5dd2e?w=563&h=299&f=webp&s=27930)
Spring的bean的生命周期以及更多内容可以查看[一文轻松搞懂Spring中bean的作用域与生命周期](https://mp.weixin.qq.com/s?__biz=MzU4NDQ4MzU5OA==&mid=2247484400&idx=2&sn=7201eb365102fce017f89cb3527fb0bc&chksm=fd985591caefdc872a2fac897288119f94c345e4e12150774f960bf5f816b79e4b9b46be3d7f&token=1990180468&lang=zh_CN#rd)
### 11. Spring 中的事务传播行为了解吗TransactionDefinition 接口中哪五个表示隔离级别的常量?
#### 事务传播行为
事务传播行为(为了解决业务层方法之间互相调用的事务问题):
当事务方法被另一个事务方法调用时必须指定事务应该如何传播。例如方法可能继续在现有事务中运行也可能开启一个新事务并在自己的事务中运行。在TransactionDefinition定义中包括了如下几个表示传播行为的常量
**支持当前事务的情况:**
- TransactionDefinition.PROPAGATION_REQUIRED 如果当前存在事务,则加入该事务;如果当前没有事务,则创建一个新的事务。
- TransactionDefinition.PROPAGATION_SUPPORTS 如果当前存在事务,则加入该事务;如果当前没有事务,则以非事务的方式继续运行。
- TransactionDefinition.PROPAGATION_MANDATORY 如果当前存在事务则加入该事务如果当前没有事务则抛出异常。mandatory强制性
**不支持当前事务的情况:**
- TransactionDefinition.PROPAGATION_REQUIRES_NEW 创建一个新的事务,如果当前存在事务,则把当前事务挂起。
- TransactionDefinition.PROPAGATION_NOT_SUPPORTED 以非事务方式运行,如果当前存在事务,则把当前事务挂起。
- TransactionDefinition.PROPAGATION_NEVER 以非事务方式运行,如果当前存在事务,则抛出异常。
**其他情况:**
- TransactionDefinition.PROPAGATION_NESTED 如果当前存在事务则创建一个事务作为当前事务的嵌套事务来运行如果当前没有事务则该取值等价于TransactionDefinition.PROPAGATION_REQUIRED。
#### 隔离级别
TransactionDefinition 接口中定义了五个表示隔离级别的常量:
- **TransactionDefinition.ISOLATION_DEFAULT:** 使用后端数据库默认的隔离级别Mysql 默认采用的 REPEATABLE_READ隔离级别 Oracle 默认采用的 READ_COMMITTED隔离级别.
- **TransactionDefinition.ISOLATION_READ_UNCOMMITTED:** 最低的隔离级别,允许读取尚未提交的数据变更,可能会导致脏读、幻读或不可重复读
- **TransactionDefinition.ISOLATION_READ_COMMITTED:** 允许读取并发事务已经提交的数据,可以阻止脏读,但是幻读或不可重复读仍有可能发生
- **TransactionDefinition.ISOLATION_REPEATABLE_READ:** 对同一字段的多次读取结果都是一致的,除非数据是被本身事务自己所修改,可以阻止脏读和不可重复读,但幻读仍有可能发生。
- **TransactionDefinition.ISOLATION_SERIALIZABLE:** 最高的隔离级别完全服从ACID的隔离级别。所有的事务依次逐个执行这样事务之间就完全不可能产生干扰也就是说该级别可以防止脏读、不可重复读以及幻读。但是这将严重影响程序的性能。通常情况下也不会用到该级别。
### 12. SpringMVC 原理了解吗?
![SpringMVC 原理](https://user-gold-cdn.xitu.io/2018/11/10/166fd45787394192?w=1015&h=466&f=webp&s=35352)
客户端发送请求-> 前端控制器 DispatcherServlet 接受客户端请求 -> 找到处理器映射 HandlerMapping 解析请求对应的 Handler-> HandlerAdapter 会根据 Handler 来调用真正的处理器开处理请求,并处理相应的业务逻辑 -> 处理器返回一个模型视图 ModelAndView -> 视图解析器进行解析 -> 返回一个视图对象->前端控制器 DispatcherServlet 渲染数据Moder->将得到视图对象返回给用户
关于 SpringMVC 原理更多内容可以查看我的这篇文章:[SpringMVC 工作原理详解](https://mp.weixin.qq.com/s?__biz=MzU4NDQ4MzU5OA==&mid=2247484496&idx=1&sn=5472ffa687fe4a05f8900d8ee6726de4&chksm=fd985231caefdb27fc75b44ecf76b6f43e4617e0b01b3c040f8b8fab32e51dfa5118eed1d6ad&token=1990180468&lang=zh_CN#rd)
### 13. Spring AOP IOC 实现原理
过了秋招挺长一段时间了,说实话我自己也忘了如何简要概括 Spring AOP IOC 实现原理,就在网上找了一个较为简洁的答案,下面分享给各位。
**IOC:** 控制反转也叫依赖注入。IOC利用java反射机制AOP利用代理模式。IOC 概念看似很抽象但是很容易理解。说简单点就是将对象交给容器管理你只需要在spring配置文件中配置对应的bean以及设置相关的属性让spring容器来生成类的实例对象以及管理对象。在spring容器启动的时候spring会把你在配置文件中配置的bean都初始化好然后在你需要调用的时候就把它已经初始化好的那些bean分配给你需要调用这些bean的类。
**AOP** 面向切面编程。Aspect-Oriented Programming 。AOP可以说是对OOP的补充和完善。OOP引入封装、继承和多态性等概念来建立一种对象层次结构用以模拟公共行为的一个集合。实现AOP的技术主要分为两大类一是采用动态代理技术利用截取消息的方式对该消息进行装饰以取代原有对象行为的执行二是采用静态织入的方式引入特定的语法创建“方面”从而使得编译器可以在编译期间织入有关“方面”的代码属于静态代理。