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也满了后执行
最大线程该如何定义?(调优)
  1. CPU 密集型 几核就是几,可以保证CPU效率最高
  1. IO密集型 ,判断你程序十分耗IO的线程,大于他即可
  1. CPU密集型就是要大量计算的:比如说视频加密解压这些
  1. IO密集型就是读写或调用API的,比如数据库连接等

场景题

阻塞队列设置过长的影响?

  1. 导致线程池无法扩容至max,无法发挥多线程的能力,导致服务相应变慢

核心线程设置过大的影响

  1. 内存占用过多,大量空闲线程占用内存,甚至可能报OOM(核心线程是懒加载的,一开始不会初始化核心线程,只有在调用时才开始创建,并且核心线程创建后就长期占用,不像最大线程会在空闲回收)

最大线程设置过大的影响

  1. 极端情况下,可能内存溢出OOM
  1. 拒绝策略失效

volatile

Volatile是Java虚拟机提供轻量级的同步机制

可见性

意识是当多个线程访问同一个变量时,当一个线程修改了该变量,那某其他线程立即能看到该值的变化
原理:
当一个变量被声明为 volatile 时,所有线程访问这个变量前从主内存中读取,修改后立即将其值刷新到主内存,确保了变量的可见性
所有其他线程在读取该变量时,会直接从主内存中获取最新值,而不是从自己的本地缓存中读取。

禁止指令重排

指令重排的意思是,计算机在执行我们写的程序时,为了提高性能,编译器和处理器常常会对指令做重排序。
而针对volatile修饰的变量,会在它的读写操作前后插入内存屏障,阻止前后指令进行指令重排

JMM

Java Memory Model
它是不存在的东西,概念!约定!
关于JMM一些同步的约定
  1. 线程加锁前,必须读取主存中的最新值load到工作内存中!
  1. 线程解锁前,必须把工作内存中的值返回主存
notion image

死锁

构成死锁条件

比如说A线程持有A锁,B线程持有B锁,但他们都想去获取对方的锁
  1. 互斥,即一个资源只能给一个线程使用
  1. 请求与保持:线程在请求新的资源时并不会放弃原来资源
  1. 不可剥夺:线程所获得的资源在使用完前无法被其他线程获得
  1. 循环等待:线程之间获取资源的顺序构成了环路

解决方法

ThreadLocal

  1. 也称线程局部变量
  1. 确保每一个线程都有自己的变量副本,并且是线程安全的
  1. 应用场景:
    1. 线程隔离:在多线程环境下,ThreadLocal确保每个线程都有自己的变量副本啊,从而实现线程隔离
    2. 跨函数数据传递:ThreadLocal可以在同一个线程内跨类和方法传递数据,减少参数传递与耦合性

CompletableFuture

上一篇
Prompt-Engineering
下一篇
Java
Loading...