面试题库
Java面试手册:github.com/Snailclimb/…
Java开源项目:github.com/Snailclimb/…
1.Java基础
1.1 Java线程池有哪几种?以及线程池的运行机制是怎样的?
线程池核心参数:核心线程数、最大线程数、keepAliveTime、阻塞队列、任务拒绝策略
线程如果在执行任务过程中抛出异常,且未被捕获,则会创建一个新的工作线程。
execute()和submit()两种方式抛出异常有什么不同?
1.2 线程池有哪些状态?线程池的shutdown和shutdownNow的区别?线程池关闭是如何实现的?
线程池有5种状态:RUNNING、SHUTDOWN、STOP、TIDYING、TERMINATED。
两者都不会接受新的任务,并且不会等待先前submit的任务执行完成,使用awaitTermination()可以做到。
shutdown()之前submit的task会被执行,重复调用shutdown没有任何影响。
shutdownNow()会尝试停止所有正在运行的任务,暂停所有等待执行的任务。除了尽最大努力尝试停止正在运行的任务外,没有任何保证。例如:典型的实现将通过Thread.interrupt取消,因此任何无法响应中断的任务都可能永远不会终止。
1.3 线程有哪些状态?T1线程是如何获取T2线程的运行结果的?
线程有6种状态:NEW、RUNNABLE、BLOCKED、WAITING、TIMED_WAITING、TERMINATED。可以通过java.lang.Thread.State查看。
线程池可以通过调用submit()来获取Future对象,然后进一步通过Future对象的get()方法拿到运行结果。
submit()是调用execute()执行任务的,但是在调用execute()之前,任务会被封装进FutureTask类中,然后最终工作线程执行的是FutureTask中的run()方法。run()方法中把执行的结果或异常封装进了FutureTask类中的outcome属性中。
1.4 单例模式扩展实现
2.Java并发
2.1 Synchronized和Reentrantlock的区别?
《Java面试突击》第2.3章节
- 两者都是可重入锁(分别是怎么实现的)
- Synchronized依赖于JVM,Reentrantlock依赖于API
- Reentrantlock比Synchronized更灵活
- 等待可中断
- 可实现公平锁
- 可实现选择性通知(锁可以绑定多个条件)
2.2 Synchronized锁优化了哪些内容?
2.3 volatile有哪些作用?
2.4 保证线程安全有哪些方式?
2.5 happens before原则是什么?
2.6 何谓悲观锁与乐观锁
- 乐观锁适合读多写少的情况(冲突少:版本号机制、CAS)
- 悲观锁适合写比较多的情况(冲突多:Synchronized、ReentrantLock)
2.7 CAS算法的ABA问题可以使用AtomicStampedReference解决
- CAS存在ABA问题和循环时间长(自旋)开销大的问题
2.8 Unix的IO模型有哪些?
2.9 Reactor线程模型能讲一下吗?
3.Java虚拟机
3.1 Java虚拟机垃圾收集器有哪些?
新生代垃圾收集器有Serial、ParNew、Parallel Scan
老年代垃圾收集器有Serial Old、CMS、Parallel Old
最新JVM虚拟机前沿结果G1垃圾收集器
3.2 JVM分代收集算法是怎么样的?
3.3 CMS有哪些缺点?
3.4 G1有哪些优点?内存模型是怎样的?
3.5 类加载的过程?
3.6 双亲委托机制是怎么样的?
4.MySQL
4.1 事务隔离级别和锁
4.2 MySQL的聚簇索引和非聚簇索引的区别?
4.3 MySQL非聚簇索引为什么存储的是主键而不是引用地址?
4.4 MySQL什么情况下会索引失效?
4.5 分布式id如何设计?雪花算法有什么缺陷,怎么解决?
4.6 分库分表中间件有哪些?
4.7 数据库MVCC机制了解吗?
5.Redis
5.1 Redis是如何实现分布式锁的?
5.2 Redis有哪些数据结构?
5.3 Redis设置了过期时间的数据是如何删除的?
5.4 Redis内存淘汰策略有哪些?
5.5 缓存雪崩、缓存穿透、缓存击穿如何解决?
6.Zookeeper
6.1 Zookeeper领导选举?
6.2 Zookeeper实现分布式锁?
6.3 Zookeeper最多可以宕机几台服务器?
7.Dubbo
7.1 Dubbo服务的注册和发现是怎样的?
7.2 Dubbo服务消费者调用过程
7.3 Dubbo的负载均衡有哪些算法?
7.4 Dubbo的SPI机制是什么?
7.5 Dubbo服务的消费者和提供者是怎么连接的?每个都建立一个连接吗?
7.6 Dubbo通行证怎么实现?
7.7 监控中心底层实现是怎样的?
7.8 如何实现traceID贯穿整个Dubbo调用链?
8.RocketMQ
8.1 RocketMQ的消息可靠性是如何保证的?
8.2 RocketMQ两种消费消息的区别是什么?
9.Spring
9.1 Spring依赖注入是什么?有哪几种方式?
9.2 Spring的AOP是怎么实现的?
9.3 Spring循环依赖是怎么解决的?
9.4 Spring的Bean生命周期是怎样的?
9.5 Spring是如何整合MyBatis的?
9.6 Spring用到了哪些设计模式?
9.7 如何自定义实现一个Spring Boot Starter?
10.MyBatis
10.1 MyBatis是如何实现插入后返回id的?
11.数据结构 + 算法
12.系统设计
12.1 数据传输如何保证安全性?通过什么方式可以保证数据是没有被篡改的?
数据安全定义:
- 保密性:只有自己和允许的人能看到或看懂数据
- 完整性:数据没有被破坏或篡改
- 可信任性:确保消息是对方发的,不是伪造者发的
加密算法:散列算法(MD5、SHA)、对称加密算法(DES、AES)、非对称加密算法(RSA、ECC)
非对称加密算法:
- 公钥加密;此种情况只有私钥能进行解密,即可以保证数据传输的安全性。(存在数据篡改问题)
- 私钥签名:此种情况可以验证发送者身份。
数字证书:为了方便传递公钥秘钥,一般把它存储在数字证书中,为了保证证书的可信性,一般由专业证书机构颁发。
CA就是证书的签发机构,负责签发证书、认证证书、管理已颁发证书的机关,制定了具体步骤来验证、识别用户身份,并对用户证书进行签名,以确保证书持有者的身份和公钥的拥有权。
12.2 如何设计一个积分系统,需要考虑积分有效期和由于做任务赚积分带来的大数据量问题
12.3 开门红活动目前方案存在的缓存与数据库一致性怎么解决?(面试官说用DB)
12.4 业务员分配的轮询问题也可通过消息队列来解决
12.5 当前系统的技术栈以及内部的架构是怎样的,请用类图描述
12.6 整个业务的业务架构图是怎样的(需画出相关系统的层级关系)
13.源码解读
13.1 Spring IOC容器启动过程
- AbstractApplicationContext的refresh()方法是启动入口。
- DefaultListableBeanFactory继承了AbstractAutowireCapableBeanFactory,实现了ConfigurableListableBeanFactory和BeanDefinitionRegistry接口。
- BeanDefinition
- XmlBeanDefinitionReader