JUC
type
Post
status
Published
date
Feb 23, 2026
slug
juc
summary
tags
category
Java Web
icon
password
Place
只有在简历上写了才会考,所以最常考的就只有线程池了,这也是最常用的
线程池
三大方法,七大参数,四大拒绝策略
任务执行流程:线程数->阻塞队列->最大线程数
3大方法(不建议使用)
7大参数
new ThreadPoolExecutor
4大拒绝策略
当Max也满了后执行
最大线程该如何定义?(调优)
- CPU 密集型 几核就是几,可以保证CPU效率最高
- IO密集型 ,判断你程序十分耗IO的线程,大于他即可
- CPU密集型就是要大量计算的:比如说视频加密解压这些
- IO密集型就是读写或调用API的,比如数据库连接等
场景题
阻塞队列设置过长的影响?
- 导致线程池无法扩容至max,无法发挥多线程的能力,导致服务相应变慢
核心线程设置过大的影响
- 内存占用过多,大量空闲线程占用内存,甚至可能报OOM(核心线程是懒加载的,一开始不会初始化核心线程,只有在调用时才开始创建,并且核心线程创建后就长期占用,不像最大线程会在空闲回收)
最大线程设置过大的影响
- 极端情况下,可能内存溢出OOM
- 拒绝策略失效
volatile
Volatile是Java虚拟机提供轻量级的同步机制
可见性
意识是当多个线程访问同一个变量时,当一个线程修改了该变量,那某其他线程立即能看到该值的变化
原理:
当一个变量被声明为
volatile 时,所有线程访问这个变量前从主内存中读取,修改后立即将其值刷新到主内存,确保了变量的可见性所有其他线程在读取该变量时,会直接从主内存中获取最新值,而不是从自己的本地缓存中读取。
禁止指令重排
指令重排的意思是,计算机在执行我们写的程序时,为了提高性能,编译器和处理器常常会对指令做重排序。
而针对volatile修饰的变量,会在它的读写操作前后插入内存屏障,阻止前后指令进行指令重排
JMM
Java Memory Model
它是不存在的东西,概念!约定!
关于JMM一些同步的约定
- 线程加锁前,必须读取主存中的最新值load到工作内存中!
- 线程解锁前,必须把工作内存中的值返回主存

死锁
构成死锁条件
比如说A线程持有A锁,B线程持有B锁,但他们都想去获取对方的锁
- 互斥,即一个资源只能给一个线程使用
- 请求与保持:线程在请求新的资源时并不会放弃原来资源
- 不可剥夺:线程所获得的资源在使用完前无法被其他线程获得
- 循环等待:线程之间获取资源的顺序构成了环路
解决方法
ThreadLocal
- 也称线程局部变量
- 确保每一个线程都有自己的变量副本,并且是线程安全的
- 应用场景:
- 线程隔离:在多线程环境下,ThreadLocal确保每个线程都有自己的变量副本啊,从而实现线程隔离
- 跨函数数据传递:ThreadLocal可以在同一个线程内跨类和方法传递数据,减少参数传递与耦合性
CompletableFuture
上一篇
Prompt-Engineering
下一篇
Java
Loading...