当前位置: 首页 > news >正文

上下文切换及线程操作相关内容

一、上下文切换深度解析

1. 切换过程拆解
暂停线程A
保存A的上下文
'PC+寄存器值'
加载线程B的上下文
恢复B的执行位置
2. 性能影响关键点
  • 直接开销
    • 寄存器保存/恢复:约1000-3000时钟周期
    • TLB缓存失效:导致内存访问延迟增加
  • 间接开销
    • CPU缓存命中率下降(新线程数据未缓存)
    • 调度器计算消耗(如CFS调度器的红黑树调整)
3. 优化策略
// 减少切换的编码实践
1. 避免过度创建线程(使用线程池)
2. 减小临界区范围(同步代码块最小化)
3. 使用无锁数据结构(如ConcurrentHashMap

二、线程创建方式对比

1. 无返回值实现
方式示例代码优缺点
继承Threadclass MyThread extends Thread简单但Java单继承限制
实现Runnablenew Thread(() -> {}).start()推荐方案,灵活组合
2. 带返回值实现
// Callable + FutureTask 示例
Callable<Integer> task = () -> {TimeUnit.SECONDS.sleep(1);return 42;
};
FutureTask<Integer> future = new FutureTask<>(task);
new Thread(future).start();
System.out.println(future.get()); // 阻塞获取结果

三、线程中断机制详解

1. 中断流程
阻塞中
运行中
ThreadA调用threadB.interrupt方法
设置threadB的中断标志位
threadB检查中断
抛出InterruptedException
自行处理标志位
2. 正确中断实践
// 标准中断处理模板
public void run() {while (!Thread.currentThread().isInterrupted()) {try {// 业务代码TimeUnit.MILLISECONDS.sleep(100);} catch (InterruptedException e) {// 恢复中断状态(避免吞没中断)Thread.currentThread().interrupt();break;}}
}

四、volatile与锁的对比

1. volatile适用场景
  • 单写多读:如开关标志位
    private volatile boolean running = true;
    
  • 禁止重排序:DCL单例模式
    private static volatile Singleton instance;
    
2. 锁的选择策略
锁类型特点适用场景
synchronizedJVM内置,自动释放简单同步需求
ReentrantLock可中断、公平锁、条件变量复杂同步控制
StampedLock乐观读锁读多写少的高性能场景

五、CompletableFuture进阶

1. 核心方法速查
方法作用异步示例
supplyAsync()带返回值的异步任务supplyAsync(() -> "result")
thenApply()结果转换.thenApply(s -> s.length())
thenCombine()合并两个任务结果future1.thenCombine(future2, (a,b) -> a+b)
exceptionally()异常处理.exceptionally(ex -> "fallback")
2. 超时控制最佳实践
CompletableFuture.supplyAsync(() -> {// 长时间任务return fetchData();
}).get(2, TimeUnit.SECONDS); // 抛出TimeoutException

六、生产环境问题排查

1. 线程状态诊断命令
jstack <pid> | grep -A 1 "java.lang.Thread.State"  # 查看线程状态分布
jcmd <pid> Thread.print                            # 完整线程转储
2. 常见死锁模式
// 典型的交叉锁死锁
Thread1: 锁定A后尝试获取B
Thread2: 锁定B后尝试获取A

通过jstack输出的Found one Java-level deadlock可快速定位。

http://www.xdnf.cn/news/1323325.html

相关文章:

  • 微信小程序通过uni.chooseLocation打开地图选择位置,相关设置及可能出现的问题
  • 开放最短路径优先协议
  • Python装饰器:从入门到精通
  • QNX 性能分析工具(hogs pidin tracelogger)
  • IOPaint 远程修图:cpolar 内网穿透服务实现跨设备图片编辑
  • Less (CSS 预处理器)
  • 贪心算法(Greedy Algorithm)详解
  • html页面打水印效果
  • 跨平台RTSP播放器深度对比:开源方案与商业SDK的取舍之道
  • 无人机迫降模式技术要点解析
  • 【C语言16天强化训练】从基础入门到进阶:Day 2
  • 基于ssm jsp中学校园网站源码和答辩PPT论文
  • 深入解析StatefulSet与K8s服务管理
  • 解锁 JavaScript 高级技能:从基础到实战的进阶指南
  • 【案例】ECharts 环形图中心下移后,如何保持中间图片和文案居中
  • 20250818在荣品的PRO-RK3566开发板跑Buildroot的时候使用在线秒表https://tool.hiofd.com/stopwatch/
  • 决策树:机器学习中的强大工具
  • 机器学习(决策树)
  • VLN视觉语言导航(3)——神经网络的构建和优化 2.3
  • 理解AQS的原理并学习源码
  • 大厂 | 华为半导体业务部2026届秋招启动
  • Spark 运行流程核心组件(三)任务执行
  • 【lucene】tip文件详解
  • 08.常见文本处理工具
  • 基于Spring Boot+Vue的社区便民服务平台 智慧社区平台 志愿者服务管理
  • 咨询进阶——解读咨询顾问技能模型
  • QT 字节大小端转序方法
  • axure chrome 浏览器插件的使用
  • kafka的pull的依据
  • 关系型数据库与非关系型数据库