多线程面试题
1. Sychronized的锁升级过程是怎样的?
2. Tomcat 中为什么要使用自定义类加载器?
3. 说说对线程安全的理解
4. 对守护线程的理解
5. 并发、并行、串行之间的区别
6. Java死锁如何避免?
7. 谈谈你对AQS的理解,AQS如何实现可重入锁?
8. 线程池的7个参数?
9. 线程池中的核心属性ctl是什么?
10. 线程池的执行流程?
11. 线程池的拒绝策略有哪些?
线程池的默认拒绝策略为AbortPolicy
,即丢弃任务并抛出RejectedExecutionException异常
当线程池的任务缓存队列已满
并且线程池中的线程数目达到maximumPoolSize
时,如果还有任务到来就会采取任务拒绝策略,通常有以下四种策略:
- ThreadPoolExecutor.
AbortPolicy
:丢弃任务并抛出RejectedExecutionException异常。
- ThreadPoolExecutor.
DiscardPolicy
:丢弃任务,但是不抛出异常
。 - ThreadPoolExecutor.
DiscardOldestPolicy
:丢弃队列最前面的任务,然后重新提交被拒绝的任务
- ThreadPoolExecutor.
CallerRunsPolicy
:由调用线程
(提交任务的线程)处理该任务
12. 线程池为什么是先添加队列而不是先创建最大线程?
13. 说说HashMap的put方法
14. 深拷贝和浅拷贝
15. Jdk1.7到Jdk1.8 HashMap发生了什么变化(底层)?
16. HashMap的扩容机制原理?
17. 谈谈ConcurrentHashMap的扩容机制
18. ThreadLocal的底层原理和使用场景
两大使用场景:
1.典型场景一:每个线程需要一个独享的对象(通常是工具类,典型需要使用的类有SimpleDateFormat和Random)
2.典型场景二:每个线程内需要保存全局变量(例如在拦截器中获取用户信息),可以让不同方法直接使用,避免参数传递的麻烦。
19. ReentrantLock中的公平锁和非公平锁的底层实现
20. ReentrantLock中tryLock()和lock()方法的区别
21. Sychronized的偏向锁、轻量级锁、重量级锁
22. 创建线程的几种方式
1 . 继承Thread类
- 实现Runnable接口
3. 实现Callable接口
4. 利用线程池来创建线程
23. 为什么不建议使用Executors来创建线程池
24. 线程池有哪几种状态?每种状态分别表示什么?
25. Sychronized和 ReentrantLock的区别?
26. 线程池的几种实现
Java线程池类型有四种,分别为:newCachedThreadPool、newFixedThreadPool、newSingleThreadExecutor、newScheduleThreadPool。
1、newCachedThreadPool
:创建一个可缓存线程池
,如果线程池长度超过处理所需,可灵活回收空闲线程
,若线程数不够,则新建线程。
2、newFixedThreadPool
:创建一个固定大小的线程池。可控制并发的线程数量,如果工作线程数量达到线程池初始的最大数,则将提交的任务存入到池队列中。
3、newSingleThreadExecutor
:创建一个单线程的线程池,即只创建唯一的工作者线程来执行任务,,保证所有任务按照指定顺序(FIFO, LIFO, 优先级)执行。
4、newScheduleThreadPool
:创建一个定长的线程池,支持定时及周期性任务执行。
27. 线程池核心数与最大线程数设置
CPU密集型
可以理解为 就是处理繁杂算法的操作,对硬盘等操作不是很频繁,比如一个算法非常之复杂,可能要处理半天,而最终插入到数据库的时间很快。
IO密集型
可以理解为简单的业务逻辑处理,比如计算1+1=2,但是要处理的数据很多,每一条都要去插入数据库,对数据库频繁操作。
核心线程:
- CPU密集型:核心线程数=CPU核心数(或 核心线程数=CPU核心数+1)。
- I/O密集型:核心线程数=2*CPU核心数(或 核心线程数=CPU核心数/(1-阻塞系数))。
最大线程:
- CPU密集型应用,最大线程设置为 N+1。
- IO密集型经验应用,最大线程设置为 2N+1 (N为CPU数量,下同)。