Java后端线程面试笔记

前言:

本章内容来自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

ThreadLocal-内存泄露问题

总结

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值