前言:
本章内容来自B站黑马程序员java大厂面试题
博主学习笔记,如果有不对的地方,海涵。
题目上的【*】代表出现频率
如果这篇文章对你有帮助,可以点点关注,点点赞,谢谢你!
1.线程的基础知识:
1.1线程和进程的区别【**】
进程
线程:
区别:
1.2并行和并发有什么区别?【**】
单核cpu:
多核CPU:
总结:
1.3创建线程的方式有哪些?【****】
继承Thread类
实现runnable接口
实现Callable接口
线程池创建线程***
项目中使用
runnable 和 callable 有什么区别?
线程的 run()和 start()有什么区别?
多次调用同一个线程的start方法会报错
1.4线程包括哪些状态,状态之间是如何变化的【****】
状态:
变化:
1.5新建 T1、T2、T3 三个线程,如何保证它们按顺序执行?【***】
使用线程中的join方法解决
1.6notify()和 notifyAll()有什么区别?
1.7在java中wait和sleep方法的不同?【***】
1.8如何停止一个正在运行的线程?【**】
2.线程中并发安全的问题
2.1synchronized关键字的底层原理【****】
底层是Monitor:
锁升级:
重量级锁
轻量级锁
偏向锁
锁升级总结
2.2你谈谈 JMM(Java内存模型)【***】
2.3CAS 你知道吗?【**】
介绍
乐观锁和悲观锁的区别
2.4谈谈你对 volatile 的理解
保证线程间的可见性
禁止指令重排序
总结:
2.5什么是AQS?【***】
原子性:CAS
公平锁和非公平锁
都可以实现
2.6ReentrantLock的实现原理
特点
底层:
总结:
2.7 synchronized和Lock有什么区别 ?【****】
2.8死锁产生的条件是什么?
介绍
线程t1持有A的锁等待获取B锁,线程t2持有B的锁等待获取A的锁。互相等待锁释放,产生死锁!
判断死锁方法
jdk自带工具
可视化工具:
2.9 聊一下ConcurrentHashMap【****】
总结
2.10 导致并发程序出现问题的根本原因是什么【***】
(Java程序中怎么保证多线程的执行安全)
3. 线程池
3.1 说一下线程池的核心参数【****】
线程池的执行原理
3.2 线程池中有哪些常见的阻塞队列【***】
3.3如何确定核心线程数【***】
3.4线程池种类
固定线程数
单线程化
可缓存线程池
提供了“延迟”和“周期执行”功能的ThreadPoolExecutor
总结
3.5为什么不建议用Executors创建线程池【***】
推荐使用七个参数的:ThreadPoolExcutor
4.项目使用场景
4.1你们项目哪里用到了多线程【****】
ES数据批量导入
在我们项目上线之前,我们需要把数据库中外来人员信息数据一次性的同步到es索引库中,但是当时的数据好像是10万左右,一次性读取数据肯定不行(oom异常),当时我就想到可以使用线程池的方式导入,利用CountDownLatch来控制,就能避免一次性加载过多,防止内存溢出
数据汇总
查询支付信息,订单信息,商品信息 (不同微服务下)远程调用
串行执行:time=t1+t2+t3
提交到线程池:并行执行:time=Max(t1,t2,t3)
异步调用
4.2如何控制某个方法允许并发访问线程的数量【**】
4.3谈谈你对ThreadLocal的理解【****】
介绍:
使用方法:
底层实现
set
get/remove