一、Java 基础
1. JDK 和 JRE 有什么区别?
2. == 和 equals 有什么区别?
3. 两个对象的 hashCode()相同,则 equals()也必须是 true,对吗?
4. final 在 java 它的作用是什么?
5. java 中的 Math. round(-1. 5) 等于多少?
6. String 属于基础数据类型吗?
7. java 操作字符串有哪些类型?它们有什么区别?
8. String str="i"与 String str=new String(“i一样吗?
9. 如何反转字符串?
10. String 常用的方法有哪些?
11. 抽象必须有抽象的方法吗?
12. 普通和抽象有什么区别?
13. 可使用抽象类 final 修饰吗?
14. 接口和抽象有什么区别?
15. java 中 IO 有多少种流?
16. BIO、NIO、AIO 有什么区别?
二、容器
1. java 容器有哪些?
2. Collection 和 Collections 有什么区别?
3. List、Set、Map 两者有什么区别?
4. HashMap 和 Hashtable 有什么区别?
5. 如何决定使用 HashMap 还是 TreeMap?
6. 说一下 HashMap 实现原理?
7. 说一下 HashSet 实现原理?
8. ArrayList 和 LinkedList 有什么区别?
9. 如何实现数组和 List 两者之间的转换?
10. ArrayList 和 Vector 有什么区别?
11. Array 和 ArrayList 有何区别?
12. 在 Queue 中 poll()和 remove()有什么区别?
13. 线程安全的集合类是什么?
14. 迭代器 Iterator 是什么?
15. Iterator 如何使用?有什么特点?
16. Iterator 和 ListIterator 有什么区别?
17. 如何确保集合不能修改?
三、多线程
1. 并行和并发有什么区别?
2. 线程和过程的区别?
3. 什么是守护线程?
4. 创建线程的方法有哪些?
5. 说一下 runnable 和 callable 有什么区别?
6. 线程的状态是什么?
7. sleep() 和 wait() 有什么区别?
8. notify()和 notifyAll()有什么区别?
9. 线程的 run()和 start()有什么区别?
10. 创建线程池的方法有哪些?
11. 线程池的状态是什么?
12. 线程池中 submit()和 execute()方法有什么区别?
13. 线程池的原理?
14. 如何合理设置线程池的参数?
15. 在 java 如何保证多线程在程序中的安全运行?
16. 多线程锁的升级原理是什么?
17. 什么是死锁?
18. 如何防止死锁?
19. ThreadLocal 是什么?有哪些使用场景?
20. ThreadLocal实现原理?
21. ThreadLocal内存泄漏是怎么回事?如何解决?
22. 说一下 synchronized 底层实现原理?
23. synchronized 和 volatile 有什么区别?
24. synchronized 和 Lock 有什么区别?
25. synchronized 和 ReentrantLock 有什么区别?
26. 说一下 atomic 的原理?
27. 线程同步的方法是什么?
28. AQS原理?AQS为什么要使用双向队列?AQS中的状态用volatile修饰? 说一下volatile的原理
29. CAS原理?
30. 有哪些拒绝策略?
31. 我有一个需求,多个线程同时执行,最终要等所有线程跑完,再把多个线程的结果数据合并,可以怎么实现?
32. 我想先执行线程1,线程1执行完之后,拿线程1的结果传到线程2继续处理,怎么实现?
四、反射
1. 什么是反射?
2. 什么是 java 序列化?什么情况下需要序列化?
3. 动态代理是什么?有哪些应用?
4. 怎么实现动态代理?
五、对象拷贝
1. 为什么要使用克隆?
2. 如何实现对象克隆?
3. 深拷贝和浅拷贝区别是什么?
六、Java Web
1. jsp 和 servlet 有什么区别?
2. jsp 有哪些内置对象?作用分别是什么?
3. 说一下 jsp 的 4 种作用域?
4. session 和 cookie 有什么区别?
5. 说一下 session 的工作原理?
6. 如果客户端禁止 cookie 能实现 session 还能用吗?
7. spring mvc 和 struts 的区别是什么?
8. 如何避免 sql 注入?
9. 什么是 XSS 攻击,如何避免?
10. 什么是 CSRF 攻击,如何避免?
七、异常
1. throw 和 throws 的区别?
2. final、finally、finalize 有什么区别?
3. try-catch-finally 中哪个部分可以省略?
4. try-catch-finally 中,如果 catch 中 return 了,finally 还会执行吗?
5. 常见的异常类有哪些?
八、网络
1. http 响应码 301 和 302 代表的是什么?有什么区别?
2. forward 和 redirect 的区别?
3. 简述 tcp 和 udp的区别?
4. tcp 为什么要三次握手,两次不行吗?为什么?
5. 说一下 tcp 粘包是怎么产生的?
6. OSI 的七层模型都有哪些?
7. get 和 post 请求有哪些区别?
8. 如何实现跨域?
9. 说一下 JSONP 实现原理?
10. 如何解决重复提交:
九、设计模式
1. 说一下你熟悉的设计模式?
2. 简单工厂和抽象工厂有什么区别?
十、Spring/Spring MVC
1. 为什么要使用 spring?
2. 解释一下什么是 AOP?
3. 解释一下什么是IOC?
4. spring 有哪些主要模块?
5. spring 常用的注入方式有哪些?
6. spring 中的 bean 是线程安全的吗?
7. spring 支持几种 bean 的作用域?
8. spring 自动装配 bean 有哪些方式?
9. spring 事务实现方式有哪些?
10. 说一下 Spring 的事务隔离?
11. 说一下 Spring mvc 运行流程?
12. Spring mvc 有哪些组件?
13. @RequestMapping 的作用是什么?
14@Autowired 的作用是什么?
十一、Spring Boot
1. 什么是 spring boot?
2. 为什么要用 spring boot?
3. spring boot 核心配置文件是什么?
4. Spring boot 配置文件有哪几种类型?它们有什么区别?
5. spring boot 有哪些方式可以实现热部署?
十二、Spring Cloud
「面试必背」Spring Cloud面试题(2022最新版)_柚子茶1990的博客-CSDN博客_springcloud面试题
1. 什么是微服务架构?
2. Spring Cloud 是什么?
3. SpringCloud的优缺点
4. SpringBoot和SpringCloud的区别?
5. Spring Cloud和SpringBoot版本对应关系
6. SpringCloud有哪些
7. Spring Cloud 和Dubbo区别?
8. 服务注册和发现是什么意思?Spring Cloud 如何实现?
9. Eureka怎么实现高可用?
10. 什么是Eureka的自我保护模式?
11. DiscoveryClient的作用?
12. Eureka和Zookeeper的区别?
13. Eureka和Nacos的区别:
14. 什么是网关?
15. 网关的作用是什么?
16. 什么是Spring Cloud Zuul(服务网关)?
17. 网关与过滤器有什么区别
18. 常用网关框架有那些?
19. Zuul与Nginx有什么区别?
20. 如何实现动态Zuul网关路由转发?
21. Zuul网关如何搭建集群?
22. 负载平衡的意义什么?
23. Ribbon是什么?
24. Nginx与Ribbon的区别?
25. Ribbon底层实现原理?
26. @LoadBalanced注解的作用
27. 什么是断路器?
28. 什么是 Hystrix?
29. 谈谈服务雪崩效应?
30. 在微服务中,如何保护服务?
31. 谈谈服务降级、熔断、服务隔离
32. 服务降级底层是如何实现的?
33. 什么是Feign?
34. SpringCloud有几种调用接口方式?
35. Ribbon和Feign调用服务的区别?
36. 什么是 Spring Cloud Bus?
37. 什么是Spring Cloud Config?
38. 分布式配置中心有那些框架?
40. 分布式配置中心的作用?
41. SpringCloud Config 可以实现实时刷新吗?
42. 什么是Spring Cloud Gateway?
十三、Hibernate
1. 为什么要使用 hibernate?
2. 什么是 ORM 框架?
3. hibernate 中如何在控制台查看打印的 sql 语句?
4. hibernate 有几种查询方式?
5. hibernate 实体类可以被定义为 final 吗?
6. 在 hibernate 中使用 Integer 和 int 做映射有什么区别?
7. hibernate 是如何工作的?
8. get( )和 load( )的区别?
9. 说一下 hibernate 的缓存机制?
10. hibernate 对象有哪些状态?
11. 在 hibernate 中 getCurrentSession 和 openSession 的区别是什么?
12. hibernate 实体类必须要有无参构造函数吗?为什么?
十四、Mybatis
1. mybatis 中 #{}和 ${}的区别是什么?
2. mybatis 有几种分页方式?
3. RowBounds 是一次性查询全部结果吗?为什么?
4. mybatis 逻辑分页和物理分页的区别是什么?
5. mybatis 是否支持延迟加载?延迟加载的原理是什么?
6. 说一下 mybatis 的一级缓存和二级缓存?
7. mybatis 和 hibernate 的区别有哪些?
8. mybatis 有哪些执行器(Executor)?
9分页插件的实现原理是什么?
10. mybatis 如何编写一个自定义插件?
十五、RabbitMQ
1. 有哪些工作模式
2. 消息手动确认 basicAck
3. rabbitmq 的使用场景有哪些?
4. rabbitmq 有哪些重要的角色?
5. rabbitmq 有哪些重要的组件?
6. rabbitmq 中 vhost 的作用是什么?
7. rabbitmq 的消息是怎么发送的?
8. rabbitmq 怎么保证消息的稳定性?
9. 要保证消息持久化成功的条件有哪些?
10. rabbitmq 持久化有什么缺点?
11. rabbitmq 有几种广播类型?
12. rabbitmq 怎么实现延迟消息队列?
13. rabbitmq 集群有什么用?
14. rabbitmq 节点的类型有哪些?
15. rabbitmq 集群搭建需要注意哪些问题?
16. rabbitmq 每个节点是其他节点的完整拷贝吗?为什么?
17. rabbitmq 集群中唯一一个磁盘节点崩溃了会发生什么情况?
18. rabbitmq 对集群节点停止顺序有要求吗?
十六、Kafka
十七、Zookeeper
十八、MySql
1. 数据库的三范式是什么?
2. 一张自增表里面总共有 7 条数据,删除了最后 2 条数据,重启 mysql 数据库,又插入了一条数据,此时 id 是几?
3.如何获取当前数据库版本?
4. 说一下 ACID 是什么?
5. char 和 varchar 的区别是什么?
6. float 和 double 的区别是什么?
7. mysql 的内连接、左连接、右连接有什么区别?
8.mysql 索引是怎么实现的?
9. 怎么验证 mysql 的索引是否满足需求?
10. MySQL有哪些隔离级别?每种隔离级别会有什么问题?
11. 你用过哪些存储引擎?除了MyIsam和InnoDB还用过其他引擎吗?有什么特点?
12.MyIsam和InnoDB有什么区别?说五个
13.说一下 mysql 的行锁和表锁?
14. 说一下乐观锁和悲观锁?
15. mysql 问题排查都有哪些手段?
16. 说一下MySQL索引原理,为什么使用B+树不用B树?
17. 什么是聚簇索引,什么是非聚簇索引?
18. 覆盖索引、回表这些了解过吗?什么是索引下推?
19. 复合索引为什么要使用最左前缀原则?
20. 大数据下怎么分页?
21. 什么是MySQL事务?
22. 什么是MVCC?
23. 你知道MySQL的锁吗?MySQL有哪些锁?他们有什么区别?
24. 怎么优化SQL?
25. 如何做 mysql 的性能优化?
26. mysql索引
十九、Redis
1. redis 是什么?都有哪些使用场景?
2. redis 有哪些功能?
3. redis 、memcached 、mongoDB 有什么区别?
4. redis 为什么是单线程的?
5. redis缓存穿透、缓存击穿、缓存雪崩?
6. redis 支持的数据类型有哪些?
7. redis 支持的 java 客户端都有哪些?
8. jedis 和 redisson 有哪些区别?
9. 怎么保证缓存和数据库数据的一致性?
10. redis 持久化有几种方式?
11. redis 怎么实现分布式锁?
12. MySQL分布式锁、Redis分布式锁、Zookeeper分布式锁区别?
13. redis 如何做内存优化?
14. redis 内存淘汰策略?
15. redis 常见的性能问题有哪些?该如何解决?
16. redis的zset有什么场景吗?
17. redis跳跃表?
18. redis事务?
19. redis主从原理, 哨兵原理, 集群原理
二十、JVM
1. 说一下 jvm 的主要组成部分?及其作用?
2. 说一下 jvm 运行时数据区?
3. 说一下堆栈的区别?
4. 队列和栈是什么?有什么区别?
5. 什么是双亲委派模型?
6. 说一下类加载的执行过程?
7. 怎么判断对象是否可以被回收?
8. java 中都有哪些引用类型?
9. 说一下 jvm 有哪些垃圾回收算法?
10. 说一下 jvm 有哪些垃圾回收器?
11. 详细介绍一下 CMS 垃圾回收器?
12. 新生代垃圾回收器和老生代垃圾回收器都有哪些?有什么区别?
13. 简述分代垃圾回收器是怎么工作的?
14. 说一下 jvm 调优的工具?
15. 常用的 jvm 调优的参数都有哪些?
面试题大部分来源自科骨铭星感谢大佬!!!
一、Java 基础
1. JDK 和 JRE 有什么区别?
JRE包含了java虚拟机、java基础类库,是使用java语言的编写程序的运行锁需要的软件环境。而 JDK 是程序员开发java程序所需要的开发工具包,提供给程序员使用。
2. == 和 equals 的区别是什么?
- ==是元素符,如果是基本数据类型,则比较;如果是引用数据类型,则比较。
- equals是Object的方法,比较的是,一般情况下,重写之后比较的是。
3. 两个对象的 hashCode()相同,则 equals()也一定为 true,对吗?
错,不同的两个值,hashCode可能会碰撞出现hashCode()相同
4. final 在 java 中有什么作用?
- 如果形容引用对象,那么该引用不能被改变
- 如果修饰方法,该方法不能被重写
- 如果修饰类,该类不能被继承
- 如果修饰属性,该属性不能被重新赋值
5. java 中的 Math. round(-1. 5) 等于多少?
-1
6. String 属于基础的数据类型吗?
不属于,它属于引用数据类型
7. java 中操作字符串都有哪些类?它们之间有什么区别
- String ,StringBuffer,StringBuilder
- String 声明的是不可变的对象,每次操作都会生成新的 String 对象,然后将指针指向新的 String 对象,而 StringBuffer、StringBuilder 可以在原有对象的基础上进行操作,所以在经常改变字符串内容的情况下最好不要使用 String。
- StringBuffer 和 StringBuilder 最大的区别在于,StringBuffer 是线程安全的,而 StringBuilder 是非线程安全的,但 StringBuilder 的性能却高于 StringBuffer,所以在单线程环境下推荐使用 StringBuilder,多线程环境下推荐使用 StringBuffer。
8. String str="i"与 String str=new String(“i”)一样吗?
不一样 使用String str=“i”,java虚拟机会把它分配到常量池中,而 String str=new String(“i”)创建了一个对象,会被分到堆内存中。
9. 如何将字符串反转?
- 用 StringBuild(str). reverse()
- 转为字符串数组,用空字符串拼接
10. String 类的常用方法都有那些?
length,equals,subString, indexOf,tostring,
11. 抽象类必须要有抽象方法吗?
不是必须的,可以有普通方法
12. 普通类和抽象类有哪些区别?
- 抽象类不可以被实例化,普通类可以被实例化
- 类中有抽象方法一定是抽象类,且抽象类可以有普通方法;
- 普通类不可以有抽象方法,只能有普通方法;
13. 抽象类能使用 final 修饰吗?
不能,
14. 接口和抽象类有什么区别?
- 接口是定义一种功能规范,不做具体实现
15. java 中 IO 流分为几种?
- 按照流的流向分,可以分为输入流和输出流;
- 按照操作单元划分,可以划分为字节流和字符流;
- 按照流的角色划分为节点流和处理流。
16. BIO、NIO、AIO 有什么区别?
- BIO 同步并阻塞
- NIO同步非阻塞
- AIO 异步非阻塞
17. Files的常用方法都有哪些?
- exists()检测文件路径是否存在
- createFile()创建文件
- createDirectory()创建文件夹
- delete()删除一个文件或目录
- copy()复制
二、容器
1. java 容器都有哪些?
ArrayList,LinkedList,Vecotr,HashSet,LinkedHashSet,LinkedHashMap,TreeMap,ConcurrentHashMap,HashTable
2. Collection 和 Collections 有什么区别?
Collection是集合的顶级父类, Collections是集合的工具类
3. List、Set、Map 之间的区别是什么?
- List是单列集合,有序不唯一
- Set是单列集合,无序唯一
- Map是键值对结构,Key唯一,Value不唯一 无序
4. HashMap 和 Hashtable 有什么区别?
- Hashtable 同步,线程安全;HashMap非同步,非线程安全
- Hashtable 不允许 "null" 键或值;HashMap 允许一个"null" 键和任意数量的“null”值。
- HashMap是继承自AbstractMap类,而HashTable是继承自Dictionary类
5. 如何决定使用 HashMap 还是 TreeMap?
- HashMap基于散列桶(数组和链表)实现;TreeMap基于红黑树实现。
- HashMap不支持排序;TreeMap默认是按照Key值升序排序的,可指定排序的比较器,主要用于存入元素时对元素进行自动排序。
- HashMap大多数情况下有更好的性能,尤其是读数据。在没有排序要求的情况下,使用HashMap。
- 两个都是非线程安全
6. 说一下 HashMap 的实现原理?
hashMap 实现了 Map接口,是存储键值对的接口,key不能重复,value 可以重复。一个键值对成为一个Node对象,。
- HashMap的实现基于哈希表(即数组+链表)
- JDK1. 8中做了优化(即数组+链表+二叉树(红黑树)),当链表长度大于8的时候,把链表转换为红黑树。
- 默认加载因子是0. 75(即默认认为当数组占用75%时达到上限,需要重新散列),默认数组大小是16。
- 存储方式:把key对象通过hash()方法计算出hash值,通过(n - 1) & hash(n为数组长度)一个key的hash值采用了( 两个都是1,结果为1;不然是0 )替了取模(因为对于现代的处理器来说,除法和求余数(模运算)是最慢的动作)来决定该对key对象在数组中的存储位置,当该位置有多个对象时,以链表结构存储,在JDK1. 8中当链表长度大于8时,链表将转换为红黑树结构存储。
7. 说一下 HashSet 的实现原理?
- HashSet是基于HashMap实现的,HashSet 底层使用HashMap来保存所有元素
- 因此HashSet 的实现比较简单,相关HashSet 的操作,基本上都是直接调用底层HashMap的相关方法来完成,HashSet不允许有重复的值,并且元素是无序的。
8. ArrayList 和 LinkedList 的区别是什么?
- :ArrayList底层基于数组实现,LinkedList底层基于链表实现
- : ArrayList更适合随机查找,LinkedList更适合删除和添加
- ArrayList和LinkedList都实现了List接口,但是还接口,所以LinkedList还可以当双端队列来使用。
9. 如何实现数组和 List 之间的转换?
Array. toList() 转为List; toArray()转为数组;
10. ArrayList 和 Vector 的区别是什么?
- Vector是线程安全的,也就是说它的方法直线是线程同步的,而ArrayList是线程不安全的,它的方法之间是线程不同步的
- ArrayList和Vector可以设置初始的存储空间的大小,Vector还以设置增长空间大小,而ArrayList不可以。
- Vector是增加原来存储空间的两倍,ArrayList没有明文规定,但是从源码中可以看出增长原来存储空间的1. 5倍
11. Array 和 ArrayList 有何区别?
- 长度:
-
- Array是数组,声明好之后,其长度就已经固定;
- ArrayList底层是用数组实现的,但是ArrayList的长度是可变的,在每次添加时,如果发现空间不足的话,会创建一个长度大概是原来1. 5倍的新数组(java8源码),然后把原来的数组元素复制过去。
12. 在 Queue 中 poll()和 remove()有什么区别?
- remove() 和 poll()都是用来从队列头部删除一个元素。
- 在队列元素为空的情况下,remove() 方法会抛出NoSuchElementException异常,poll()方法只会返回null。
13. 哪些集合类是线程安全的?
- Vectory,HashTable,Stack
- java. util. concurrent包下的所有集合类比如ConcurrentHashMap,CopyOnWriteArryList
14. 迭代器 Iterator 是什么?
迭代器像是游标,专门用来遍历处理集合的
15. Iterator 怎么使用?有什么特点?
集合调用iterator()方法,返回Iterator对象,可以通过hasNext 判断是否有下一元素,调用 next()方法返回元素值
16. Iterator 和 ListIterator 有什么区别?
- ListIterator有add()方法,可以向List中添加对象,而Iterator不能
- ListIterator和Iterator都有hasNext()和next()方法,可以实现顺序向后遍历,但是ListIterator有hasPrevious()和previous()方法,可以实现逆向(顺序向前)遍历。Iterator就不可以。
- ListIterator可以定位当前的索引位置,nextIndex()和previousIndex()可以实现。Iterator没有此功能。
- 都可实现删除对象,但是ListIterator可以实现对象的修改,set()方法可以实现。Iierator仅能遍历,不能修改。
17. 怎么确保一个集合不能被修改?
- 可以采用Collections包下的方法,返回的map是不可以修改的。他会报java. lang. UnsupportedOperationException错。
- Collections. 返回的list是不可以修改的
- Collections. 返回的set是不可以修改的
三、多线程
1. 并行和并发有什么区别?
- 并行是多个处理器同一时刻执行多个不同的任务;
- 并发是一个处理器同时处理多个任务,cpu快速轮转,表现为同时执行。
2. 线程和进程的区别?
- 线程是进程的执行单元实体,任何一个进程都至少有一个线程
- 进程是系统进行资源分配和调度的一个独立单位。多线程的进程程序能表现出更高的并发现
3. 守护线程是什么?
守护线程是一种特殊的线程,他用来服务与其他线程,只有当虚拟机停止,他才退出。
4. 创建线程有哪几种方式?
- 继承Thread
- 实现Runnerbale接口
- 实现Callable接口
- ThredPoolExecutor 线程池
-
- ThreadPoolExecutors 参数详解
-
-
- corePoolSize:核心线程池数,核心线程数一直存活,即便没有任务执行。
- maximumPoolSize:当核心线程数已满,阻塞队列已满时候,会继续创建线程总线程数不超过 max
- keepAliveTime 线程空闲时间,当线程空闲时间超过就销毁,最少保留核心线程数
- Unit 空闲时间单位
- workQueue 阻塞队列
- rejectedExecutionHandler 拒绝策略
-
5. 说一下 runnable 和 callable 有什么区别?
- Runnable没有返回值;Callable可以返回执行结果,是个泛型,和Future、FutureTask配合可以用来获取异步执行的结果;
- Callable接口的call()方法允许抛出异常;Runnable的run()方法异常只能在内部消化,不能往上继续抛;
6. 线程有哪些状态?
- 新建状态,new Thread()
- 就绪状态调用了 start()等待cpu执行
- 运行状态
- 阻塞状态因为某一种原因放弃CPU ,比如 sleep,join
- 死亡状态
7. sleep() 和 wait() 有什么区别?
- sleep ()是线程的方法 ,wait()是Object的方法
- sleep ()可以在任何地方使用,wait()只能在同步方法或者同步代码块中使用,
- wait()会释放锁资源,sleep()不会。
8. notify()和 notifyAll()有什么区别?
notify() 随机唤醒等待这个锁的线程,notifyAll()是唤醒所有
9. 线程的 run()和 start()有什么区别?
- run() 是一个普通方法,直接调用会在当前线程中执行run()中的代码,不会创建新线程。
- 当程序调用start()方法,将会创建一个新线程去执行run()方法中的代码。
- 另外当一个线程启动之后,不能重复调用start(),否则会报IllegalStateException异常。但是可以重复调用run()方法。
10. 创建线程池有哪几种方式?
Excutors线程池工具类,使用ThreadpoolExcutor
11. 线程池都有哪些状态?
- :运行状态,线程池创建好之后就会进入此状态,如果不手动调用关闭方法,那么线程池在整个程序运行期间都是此状态。
- :关闭状态,不再接受新任务提交,但是会将已保存在任务队列中的任务处理完。
- :停止状态,不再接受新任务提交,并且会中断当前正在执行的任务、放弃任务队列中已有的任务。
- :整理状态,所有的任务都执行完毕后(也包括任务队列中的任务执行完),当前线程池中的活动线程数降为 0 时的状态。到此状态之后,会调用线程池的 terminated() 方法。
- :销毁状态,当执行完线程池的 terminated() 方法之后就会变为此状态。
默认情况下,如果不调用关闭方法,线程池会一直处于 RUNNING 状态,而线程池状态的转移有两个路径:当调用 shutdown() 方法时,线程池的状态会从 RUNNING 到 SHUTDOWN,再到 TIDYING,最后到 TERMENATED 销毁状态;当调用 shutdownNow() 方法时,线程池的状态会从 RUNNING 到 STOP,再到 TIDYING,最后到 TERMENATED 销毁状态。
12. 线程池中 submit()和 execute()方法有什么区别?
- 接收参数不一样
-
- execute()方法只能接收Runnable类型的参数
- submit()方法可以接收Callable、Runnable两种类型的参数。Callable类型的任务是可以返回执行结果的,而Runnable类型的任务不可以返回执行结果。
- submit()提交任务后会有返回值,而execute()没有
- submit()方便Exception处理
-
- execute()方法在启动任务执行后,任务执行过程中可能发生的异常调用者并不关心。
- submit()方法返回的Future对象(异步执行实例),可以进行异步执行过程中的异常捕获。
- 在ThreadPoolExecutor类的实现中,内部核心的任务提交方法是execute()方法,虽然用户程序通过submit()也可以提交任务,但是实际上submit()方法中最终调用的还是execute()方法。
13. 线程池的原理?
当调用线程池的 execute() 方法时,线程池会做出以下判断:
- 如果当前运行的线程小于线程池的核心线程数,那么马上创建线程完成这个任务。
- 如果运行中的线程数大于等于线程池的核心线程数,那么将线程放进任务队列等待。
- 如果此时任务队列已满,且正在运行的线程数小于最大线程数,立即创建非核心线程执行这个任务。
- 如果此时任务队列已满,且正在运行的线程数等于最大线程数,则线程池会启动饱和拒绝策略来执行。
当一个任务完成时,它会从任务队列的对头去出下一个任务来执行。
当一个线程空闲超过一定时间时,线程池会判断当前运行线程数是否大于核心线程数,如果大于核心线程数,该线程就会被停掉,直至当前线程数等于核心线程数。
14. 线程池的参数应该怎么设置比较合理?
Java线程池中各个参数的合理设置方法 - 开发技术 - 亿速云
15. 在 java 程序中怎么保证多线程的运行安全?
- 互斥同步,同一时刻只让一个线程运行一段代码,阻塞同步,比如synconized,Lock
- 非阻塞同步:基于乐观的想法,先去执行,后进行校验是否与修改前一致,他的实现是CAS
- 线程本低存储如 ThreadLocal,数据不共享
- 还有可能不涉及数据共享,也就不需要管了,自然就是安全的。
16. 多线程锁的升级原理是什么?
锁升级的原理
没有优化以前,synchronized是重量级锁(悲观锁),使用 wait 和 notify、notifyAll 来切换线程状态非常消耗系统资源;线程的挂起和唤醒间隔很短暂,这样很浪费资源,影响性能。所以 JVM 对 synchronized 关键字进行了优化,把锁分为 无锁、偏向锁、轻量级锁、重量级锁 状态。
锁的级别从低到高依次为:无锁 -> 偏向锁 -> 轻量级锁 -> 重量级锁,这几个状态会随着竞争情况逐渐升级。锁可以升级但不能降级。
17. 什么是死锁?
所谓死锁,是指多个进程在运行过程中因争夺资源而造成的一种僵局,当进程处于这种僵持状态时,若无外力作用,它们都将无法再向前推进。 因此我们举个例子来描述,如果此时有一个线程A,按照先锁a再获得锁b的的顺序获得锁,而在此同时又有另外一个线程B,按照先锁b再锁a的顺序获得锁。如下图所示:
产生死锁的必要条件:
- :进程要求对所分配的资源进行排它性控制,即在一段时间内某资源仅为一进程所占用。
- :当进程因请求资源而阻塞时,对已获得的资源保持不放。
- :进程已获得的资源在未使用完之前,不能剥夺,只能在使用完时由自己释放。
- :在发生死锁时,必然存在一个进程--资源的环形链。
18. 怎么防止死锁?
- 预防死锁–针对死锁的必要条件进行预防
-
- 破坏占有且等待条件,一次性申请进程所需要的所有资源。改进:允许进程只获得运行初期的资源,在运行过程中逐步释放使用完毕的资源,申请需要的资源。
- 破坏不可抢占条件:当一个进程申请需要的资源没有被满足时,释放掉所占有的所有资源。
- 破坏循环等待条件:给每个资源编号,当一个进程占有某个资源时,只能申请比这个编号大的资源
- 2. 避免死锁–在分配资源之前判断是否会出现死锁
-
- 若一个进程的请求会导致死锁,则不启动。
19. ThreadLocal 是什么?有哪些使用场景?
ThreadLocal 是什么?有哪些使用场景?_ConstXiong的博客-CSDN博客_threadlocal是什么
ThreadLocal 是线程本地存储,在每个线程中都创建了一个 ThreadLocalMap 对象,每个线程可以访问自己内部 ThreadLocalMap 对象内的 value。
经典的使用场景是为每个线程分配一个 JDBC 连接 Connection。这样就可以保证每个线程的都在各自的 Connection 上进行数据库的操作,不会出现 A 线程关了 B线程正在使用的 Connection; 还有 Session 管理 等问题。
20. ThreadLocal的实现原理?
ThreadLocal原理详解--终于弄明白了ThreadLocal_三七有脾气的博客-CSDN博客_threadlocal原理
ThreadLocal存入值时使用当前ThreadLocal实例作为key,存入当前线程对象中的Map中去。最开始在看源码之前,我以为是以当前线程对象作为key将对象存入到ThreadLocal中的Map中去…
21. ThreadLocal的内存泄露是怎么回事?怎么解决?
如果ThreadLocal没有外部强引用,那么在发生垃圾回收的时候,ThreadLocal就必定会被回收,而ThreadLocal又作为Map中的key,ThreadLocal被回收就会导致一个key为null的entry,外部就无法通过key来访问这个entry,垃圾回收也无法回收,这就造成了内存泄漏
解决方案:
解决办法是每次使用完ThreadLocal都调用它的remove()方法清除数据,或者按照JDK建议将ThreadLocal变量定义成private static,这样就一直存在ThreadLocal的强引用,也就能保证任何时候都能通过ThreadLocal的弱引用访问到Entry的value值,进而清除掉。
22. 说一下 synchronized 底层实现原理?
真正从底层理解 Synchronized 实现原理 - 张贤同学 - 博客园
23. synchronized 和 volatile 的区别是什么?
- :volatile-变量;synchronized -方法以及代码块
- :volatile 可以保证可见性和有序性,不能保证原子性,禁止指令重排;synchronized在保证可见性和有序性的基础上,还可以保证原子性。
-
- volatile变量的原子性与synchronized的原子性是不同的。synchronized的原子性是指,只要声明为synchronized的方法或代码块,在执行上就是原子操作,synchronized能保证被锁住的整个代码块的原子性。而volatile是不修饰方法或代码块的,它只用来修饰变量,对于单个volatile变量的读和写操作都具有原子性,但类似于volatile++这种复合操作不具有原子性。所以volatile的原子性是受限制的。所以,在多线程环境中,volatile并不能保证原子性。
- :volatile主要用于解决共享变量的数据可见性问题,而synchronized主要用于保证访问数据的同步性(同时也能保证可见性)
- :
-
- volatile的有序性是通过禁止指令重排序来实现的
- synchronized无法禁止指令重排,但是可以通过单线程机制来保证有序性。由于synchronized修饰的代码,在同一时刻只能被一个线程访问,从根本上避免了多线程的情况。而单线程环境下,在本线程内观察到的所有操作都是天然有序的,所以synchronized可以通过单线程的方式来保证程序的有序性。
- :
-
- volatile是线程同步的轻量级实现,性能高于synchronized。
- 多线程访问volatile修饰的变量时不会发生阻塞(主要是因为volatile采用CAS加锁),而访问synchronized修饰的资源时会发生阻塞。
24. synchronized 和 Lock 有什么区别?
- synchronized是内置的java关键字,Lock是一个java类。
- synchronized无法判断是否获取到了锁,Lock可以判断是否获取到了锁。
- synchronized会自动释放锁,Lock必须手动释放锁。
25. synchronized 和 ReentrantLock 区别是什么?
- synchronized 可用来修饰方法、和代码块,而 ReentrantLock 只能用在代码块上
- synchronized 会自动加锁和释放锁; 而 ReentrantLock 需要手动加锁和释放锁
- synchronized 属于非公平锁,而 ReentrantLock 既可以是公平锁也可以是非公平锁
26. 说一下 atomic 的原理?
atomic通过 (Compare And Wwap)乐观锁机制-自旋锁(它的实现很简单,就是用一个预期的值和内存值进行比较,如果两个值相等,就用预期的值替换内存值,并返回 true。否则,返回 false。)保证原子性,【通过降低锁粒度(多段锁)增加并发性能。这一点是java8做出的改进】从而避免 synchronized 的高开销,执行效率大为提升。
27. 线程同步的方式有哪些?
- java 同步线程方式_延成的博客-CSDN博客_java线程的同步方式
28. AQS原理?AQS中为什么要使用双向队列?为什么AQS中的状态用volatile修饰? 说一下volatile的原理
AQS(AbstractQueuedSynchronizer)抽象队列式同步器原理:
如果被请求的资源是共享的空闲的,则将当前请求资源的线程设置为有效的工作线程,并且将共享资源设置为锁定状态。如果被请求的共享资源被占用,那么就需要一套线程阻塞等待 以及 被唤醒时 锁分配的 机制,这个机制 AQS 是用state 和 CLH 队列锁实现的,即将暂时获取不到锁的线程加入到队列中。
用大白话来说,AQS就是基于CLH队列,用volatile修饰共享变量state,线程通过CAS去改变状态符,成功则获取锁成功,失败则进入等待队列,等待被唤醒。
AQS中为什么要使用双向队列:
- 中断
-
- 用于在AQS#acquireInterruptibly(int arg)获取锁的过程中处理中断信号。
- 我们知道,相比于线程获取synchronized锁的过程中不能被中断,基于AQS实现的ReentrantLock是在获取锁的过程中是可被中断的。
- 唤醒
-
- AQS对CLH进行了改进,后继获取锁的线程在经过有限次的轮询后,依旧获取不到锁将陷入阻塞。优点:减少轮询无效操作;缺点:后继线程Node在阻塞后无法感知前一个线程Node的状态,锁被释放时将无法主动醒来。
- 于是AQS使用了双指针,在CLH的prev基础上增加了next。AQS维护了next指针,以便活跃线程释放锁后主动唤醒后续阻塞线程去竞争锁。
为什么AQS中的状态用volatile修饰:
volatile + CAS实现非阻塞式线程同步:通过Syncronized的方式当然可以实现线程同步,但是消耗太大;AQS框架使用volatile + CAS实现非阻塞式线程同步,线程同步需要保证3个方面:可见性、有序性、原子性,volatile保证了变量的可见性和有序性,用CAS操作保证变量的原子性。
volatile原理:
- 工作内存Work Memory其实就是对CPU寄存器和高速缓存的抽象,或者说每个线程的工作内存也可以简单理解为CPU寄存器和高速缓存。
- 那么当写两条线程Thread-A与Threab-B同时操作主存中的一个volatile变量i时,Thread-A写了变量i,那么:
-
- Thread-A发出LOCK#指令
- 发出的LOCK#指令锁总线(或锁缓存行),同时让Thread-B高速缓存中的缓存行内容失效
- Thread-A向主存回写最新修改的i
-
- Thread-B读取变量i,那么:
-
- Thread-B发现对应地址的缓存行被锁了,等待锁的释放,缓存一致性协议会保证它读取到最新的值
由此可以看出,volatile关键字的读和普通变量的读取相比基本没差别,差别主要还是在变量的写操作上。
29. CAS原理?
阿里二面,面试官:说说 Java CAS 原理?_爱笑的架构师的博客-CSDN博客
CAS 主要包括两个操作:Compare和Swap,有人可能要问了:两个操作能保证是原子性吗?可以的。
CAS 是一种系统原语,原语属于操作系统用语,原语由若干指令组成,用于完成某个功能的一个过程,并且原
30. 有哪些拒绝策略?
juc - 线程池之四种拒绝策略 - 简书
- AbortPolicy:直接抛出异常,默认策略;
- CallerRunsPolicy:用调用者所在的线程来执行任务;
- DiscardOldestPolicy:丢弃阻塞队列中靠最前的任务,并执行当前任务;
- DiscardPolicy:直接丢弃任务;
31. 我有一个需求,多个线程同时执行,最终要等所有线程跑完,再把多个线程的结果数据合并,可以怎么实现?
ForkJoin或者CompletableFuture (待补充)
32. 我想先执行线程1,线程1执行完之后,拿线程1的结果传到线程2继续处理,怎么实现?
CompletableFuture (待补充)
四、反射
1. 什么是反射?
运行状态下,对于任意一个类,都能够知道它所有的属性和方法,对于任意一个对象,都能够调用他的属性和方法,这种能力就是反射
2. 什么是 java 序列化?什么情况下需要序列化?
就是把java对象存储在某一个地方,比如硬盘或者网络上,把内容进行流化。
当你需要把对象在网络上传输,或者保存在文件上,就需要进行序列化
3. 动态代理是什么?有哪些应用?
在程序运行期间,创建目标对象的代理对象,并对目标对象中的方法进行功能扩展;AOP就是动态代理的一种应用
4. 怎么实现动态代理?
定义一个代理对象类,声明静态获取instance实例目标方法,返回 Proxy. newProxyInstance, 重写 invoke方法
五、对象拷贝
1. 为什么要使用克隆?
能够快速复制对象内容
2. 如何实现对象克隆?
类实现CloneAble接口,重写 clone 方法
3. 深拷贝和浅拷贝区别是什么?
深拷贝是