多线程和并发、MySQL、Spring等问题是Java技术面试中面试官最喜欢问的问题。在这里,从面试的角度列出了大部分重要的问题,但是你仍然应该牢固的掌握Java基础知识来对应日后碰到的问题。以下的各大知识点的“灵魂拷问”能够帮助你扫除面试中遇到的所有难题!
PS:文章篇幅有限,为了不影响观赏性,这些《多线程、并发、MySQL、Spring》等知识点学习资料,可以直接关注文末公众号获取
Java并发编程面试百问:
-
现在有 T1、T2、T3 三个线程,你怎样保证 T2 在 T1 执行完后执行,T3 在 T2 执行完 后执行?
这个线程问题通常会在第一轮或电话面试阶段被问到,目的是检测你对 ”join ”方法是否熟悉。这个多线程问题比较简单,可以用 join 方法实现 -
在 Java 中 Lock 接口比 synchronized 块的优势是什么?
你需要实现一个高效的缓存,它 允许多个用户读,但只允许一个用户写,以此来保持它的完整性,你会怎样去实现它?
lock 接口在多线程和并发编程中最大的优势是它们为读和写分别提供了锁,它能满足你写像 ConcurrentHashMap 这样的高性能数据结构和有条件的阻塞。Java 线程面试的问题越来 越会根据面试者的回答来提问。我强烈建议在你去参加多线程的面试之前认真读一下 Locks, 因为当前其大量用于构建电子交易终统的客户端缓存和交易连接空间 -
在 java 中 wait 和 sleep 方法的不同?
通常会在电话面试中经常被问到的 Java 线程面试问题。最大的不同是在等待时 wait 会释 放 锁,而 sleep 一直持有锁。Wait 通常被用于线程间交互,sleep 通常被用于暂停执行 -
用 Java 实现阻塞队列。
这是一个相对艰难的多线程面试问题,它能达到很多的目的。
第一,它可以检测侯选者是否能实际的用 Java 线程写程序;
第二,可以检测侯选者对并发场景的理解,并且你可以根据这个问很多问题。如果他用 wait()和 notify()方法来实现阻塞队列,你可以要求他用最新的 Java 5 中的并发类来再写 一次。 -
用 Java 写代码来解决生产者——消费者问题。
与上面的问题很类似,但这个问题更经典,有些时候面试都会问下面的问题。在 Java 中怎么解决生产者——消费者问题,当然有很多解决方法,我已经分享了一种用阻塞队列实现的方法。有些时候他们甚至会问怎么实现哲学家进餐问题。 -
用 Java 编程一个会导致死锁的程序,你将怎么解决?
这是我最喜欢的 Java 线程面试问题,因为即使死锁问题在写多线程并发程序时非常普遍, 但是很多侯选者并不能写 deadlock free code(无死锁代码?),他们很挣扎。只要告诉他们,你有N个资源和N个线程,并且你需要所有的资源来完成一个操作。为了简单这里 的 n 可以替换为 2,越大的数据会使问题看起来更复杂。通过避免 Java 中的死锁来得到关于死锁的更多信息 -
什么是原子操作,Java 中的原子操作是什么?
非常简单的 java 线程面试问题,接下来的问题是你需要同步一个原子操作。 -
Java 中的 volatile 关键是什么作用?怎样使用它?在 Java 中它跟 synchronized 方法有什么不同?
自从 Java 5 和 Java 内存模型改变以后,基于 volatile 关键字的线程问题越来越流行。应 该准备好回答关于 volatile 变量怎样在并发环境中确保可见性 -
什么是竞争条件?你怎样发现和解决竞争?
这是一道出现在多线程面试的高级阶段的问题。大多数的面试官会问最近你遇到的竞争条件,以及你是怎么解决的。有些时间他们会写简单的代码,然后让你检测出代码的竞争条 件。可以参考我之前发布的关于 Java 竞争条件的文章。在我看来这是最好的 java线程面试问题之一 -
你将如何使用 threaddump?你将如何分析 Thread dump?
在 UNIX 中你可以使用 kill -3,然后 thread dump 将会打印日志,在 windows 中你可以使用”CTRL+Break ”。非常简单和专业的线程面试问题,但是如果他问你怎样分析它,就会很棘手。
由于篇幅原因,在这就不做全部展示了,这些题我已经整理成pdf文档免费分享给那些有需要的朋友,同时整理也花费了蛮多时间,有需要的朋友可以直接关注文末公众号获取
MySQL灵魂百问
-
什么是索引?
索引是一种数据结构,可以帮助我们快速的进行数据的查找. -
索引是个什么样的数据结构呢?
索引的数据结构和具体存储引擎的实现有关, 在 MySQL 中使用较多的索引有 Hash 索引,B+树索引等,而我们经常使用的 InnoDB 存储引擎的默认索引实现 为:B+树索引. -
Hash 索引和 B+树所有有什么区别或者说优劣呢?
hash 索引进行等值查询更快(一般情况下),但是却无法进行范围查询
因为在 hash 索引中经过 hash 函数建立索引之后,索引的顺序与原顺序无法保持 一致,不能支持范围查询.而 B+树的的所有节点皆遵循(左节点小于父节点,右节点 大于父节点,多叉树也类似),天然支持范围
hash 索引不支持使用索引进行排序,原理同上.
hash 索引不支持模糊查询以及多列索引的最左前缀匹配.原理也是因为 hash 函数的不可预测.AAAA 和 AAAAB 的索引没有相关性 -
上面提到了 B+树在满足聚簇索引和覆盖索引的时候不需要回表查询数据,什 么是聚簇索引?
在 B+树的索引中,叶子节点可能存储了当前的 key 值,也可能存储了当前的 key 值以及整行的数据,这就是聚簇索引和非聚簇索引. 在 InnoDB 中,只有主键索引 是聚簇索引,如果没有主键,则挑选一个唯一键建立聚簇索引.如果没有唯一键,则 隐式的生成一个键来建立聚簇索引. -
非聚簇索引一定会回表查询吗?
不一定,这涉及到查询语句所要求的字段是否全部命中了索引,如果全部命中了索 引,那么就不必再进行回表查询. -
在建立索引的时候,都有哪些需要考虑的因素呢?
建立索引的时候一般要考虑到字段的使用频率,经常作为条件进行查询的字段比 较适合.如果需要建立联合索引的话,还需要考虑联合索引中的顺序.此外也要考 虑其他方面,比如防止过多的所有对表造成太大的压力.这些都和实际的表结构以 及查询方式有关 -
联合索引是什么?为什么需要注意联合索引中的顺序?
MySQL 可以使用多个字段同时建立一个索引,叫做联合索引.在联合索引中,如果 想要命中索引,需要按照建立索引时的字段顺序挨个使用,否则无法命中索引 -
什么是事务?
事务是一系列的操作,他们要符合 ACID 特性.最常见的理解就是:事务中的操作要 么全部成功,要么全部失败.但是只是这样还不够的 -
ACID 是什么?可以详细说一下吗?
A=Atomicity 原子性:就是上面说的,要么全部成功,要么全部失败.不可能只执行一部分操作.
C=Consistency 系统(数据库)总是从一个一致性的状态转移到另一个一致性的状态,不会存在中间状态. I=Isolation 隔离性: 通常来说:一个事务在完全提交之前,对其他事务是不可见的.注意前面 的通常来说加了红色,意味着有例外情况.
D=Durability 持久性:一旦事务提交,那么就永远是这样子了,哪怕系统崩溃也不会影响到这个 事务的结果. -
同时有多个事务在进行会怎么样呢?
多事务的并发进行一般会造成以下几个问题:
脏读: A 事务读取到了 B 事务未提交的内容,而 B 事务后面进行了回滚.
不可重复读: 当设置 A 事务只能读取 B 事务已经提交的部分,会造成在 A 事务 内的两次查询,结果竟然不一样,因为在此期间 B 事务进行了提交操作.
幻读: A 事务读取了一个范围的内容,而同时 B 事务在此期间插入了一条数据. 造成"幻觉".
Spring灵魂百问
-
谈谈对 Spring IoC 的理解?
IoC Inverse of Control 反转控制的概念。将之前程序中需要手动创建对象的操 作,交由 Spring 框架来实现,创建对象的操作被反转到了 Spring 框架。对 象的生命周期由 Spring 来管理,直接从 Spring 那里去获取一个对象。 -
谈谈对 Spring DI 的理解?
DI Dependency Injection 依赖注入。Spring 框架创建 Bean 对象时,动态 的将依赖对象注入到 Bean 组件中,实现依赖对象的注入。 -
BeanFactory 接口和 ApplicationContext 接口不同点是什么?
①.ApplicationContext 接口继承 BeanFactory 接口,Spring 核心工厂 是 BeanFactory,BeanFactory 采取延迟加载,第一次 getBean 时才 会初始化 Bean,ApplicationContext 是会在加载配置文件时初始化 Bean。
②.ApplicationContext 是对 BeanFactory 扩展,它可以进行国际化处理、 事件传递和 Bean 自动装配以及各种不同应用层的 Context 实现。
开发中基本都在使用ApplicationContext,Web项目使用WebApplicationContext ,很少用到 BeanFactory。 -
请介绍你熟悉的 Spring 核心类,并说明有什么作用?
①. BeanFactory:产生一个新的实例,可以实现单例模式
②. BeanWrapper:提供统一的 get 及 set 方法
③. ApplicationContext:提供框架的实现,包括 BeanFactory 的所有功能。 -
介绍一下 Spring 的事务的了解?
事务是数据库操作的最小工作单元,是作为单个逻辑工作单元执行的一系列操 作;这些操作作为一个整体一起向系统提交,要么都执行、要么都不执行;事务 是一组不可再分割的操作集合(工作逻辑单元)。 -
解释 AOP 模块
AOP(Aspect-Oriented Programming)是一种程序设计类型,它通过分离横 切关注点来增加程序的模块化。AOP 在不修改现有代码的情况下对现有代码添 加功能,这个是 AOP 最重要的能力。 -
Spring 的通知类型有哪些,请简单介绍一下?
Spring 的通知类型总共有 5 种:前置通知、环绕通知、后置通知、异常通知、 最终通知。
①. 前置通知(Before advice):在目标方法执行之前执行的通知。在某连 接点( join point )之前执行的通知,但这个通知不能阻止连接点前的 执行(除非它抛出一个异常)。
②. 环绕通知(Around Advice): 在目标方法执行之前和之后都可以执行 额外代码的通知。也可以选择是否继续执行连接点或直接返回它们自己的 返回值或抛出异常来结束执行。
③. 后置通知(After (finally) advice): 目标方法执行之后(某连接点退 出的时候)执行的通知(不论是正常返回还是异常退出)。
④. 异常后通知(After throwing advice):在方法抛出异常退出时执行的 通知。
⑤. 最终通知(After returning advice): 在某连接点(join point)正 常完成后执行的通知:例如,一个方法没有抛出任何异常,正常返回。 -
Spring 通知类型使用场景分别有哪些?
-
请介绍一下你对 Spring Beans 的理解?
①. Spring Beans 是被实例的,组装的及被 Spring 容器管理的 Java 对象
②. Spring Beans 会被 Spring 容器自动完成 @bean 对象的实例化
③. Spring 框架定义的 Beans 都是默认为单例,也可以配置为多例 -
Spring 有哪些优点?
①. 提供控制反转能力,将对象的创建交给了 Spring,降低了代码耦合性、 侵入性
②. Spring 是 POJO 编程,使得可持续构建和可测试能力提高
③. Spring 是开源免费的
④. 方便集成各种优秀的框架
最后
再免费分享一波我的Java专题面试真题+视频学习详解+Java进阶学习书籍
参考学习资料:Java核心技术笔记
JVM,集合,HTTP网络,多线程并发,JAVA基础,Spring,微服务,Zookeeper,Kafka,RabbitMQ,Hbase,消息中间件,MongoDB,设计模式,负载均衡,数据库,一致性哈希,算法,数据结构,加密算法,分布式缓存,Netty,Linux,Tomcat,Nginx,Redis等
各类学习书籍整理:《Redis实战》、《使用SpringCloud和Docker实战微服务》、《Spring Boot实战》、《Spring源码深度解析》、《分布式服务框架原理与实践》等等
各类面试真题整理:BAT面试常问80题、Dubbo、Netty、JVM、并发、Tomcat、MySQL、Spring、Redis、MongoDB、分布式、微服务、锁、Nginx、性能优化、Memcached等
本文的重点是你有没有收获与成长,其余的都不重要,希望读者们能谨记这一点。
整理不易,需要的朋友可以直接关注下方公众号自行获取