跳至主要內容
JDK 虚拟线程完全指南:原理、使用与常见问题

前言

JDK 21 正式将虚拟线程(Virtual Threads)作为一项特性发布,彻底改变了 Java 并发编程的格局。传统平台线程在面对高并发 I/O 密集型场景时,线程数受限于操作系统资源,开发者不得不借助异步编程或响应式框架来突破瓶颈。虚拟线程的出现让"每个请求一个线程"的简洁模型重新焕发生机——但用不对也会踩坑。

本文将系统梳理虚拟线程的原理、与平台线程的区别、正确使用方式以及常见问题。


1. 什么是虚拟线程

虚拟线程是由 JDK 而非操作系统管理的轻量级线程。它的工作原理可以概括为:

  1. 虚拟线程是用户态线程:由 JVM 调度,不直接映射到操作系统线程
  2. 载体线程(Carrier Thread):虚拟线程需要挂载到一个平台线程上才能执行
  3. 自动挂起/恢复:当虚拟线程遇到阻塞 I/O 操作时,JVM 自动将其从载体线程上卸载,载体线程可以去执行其他虚拟线程;I/O 完成后再恢复执行

郑天祺大约 10 分钟java基础Java虚拟线程并发编程
SpringMVC全局异常处理器

一、引言

SpringBoot工程中对Controller配置全局异常处理。有些接口在发生异常时,如何对不同类型的接口使用不同的全局异常进行处理呢?
Spring提供了对@ControllerAdvice注解的配置,我们可以通过配置@ControllerAdvice对指定的Exception拦截。

二、@ControllerAdvice注解使用方法

// 第一种
@RestControllerAdvice
public class GlobalExceptionHandler
{}

// 第二种
// basePackages 指定一个或多个包,这些包及其子包下的所有 Controller 都被该 @ControllerAdvice 管理。其中上面两种等价于 basePackages。
// basePackages
// @ControllerAdvice("cn.demo.controller")
// @ControllerAdvice(value = "cn.demo.controller")
@ControllerAdvice(basePackages = {"cn.demo.controller"})
public class GlobalExceptionHandler 
{}

// 第三种
// basePackageClasses 指定一个或多个 Controller 类,这些类所属的包及其子包下的所有 Controller 都被该 @ControllerAdvice 管理。
@ControllerAdvice(basePackageClasses = {MyController.class})
public class GlobalExceptionHandler {}

// 第四种
// assignableTypes:指定一个或多个 Controller 类,这些类被该 @ControllerAdvice 管理。
@ControllerAdvice(assignableTypes = {MyController.class})
public class GlobalExceptionHandler {}

// 第五种
// annotations:指定一个或多个注解,被这些注解所标记的 Controller 会被该 @ControllerAdvice 管理。
@ControllerAdvice(annotations = {RestController.class})
public class GlobalExceptionHandler {}

郑天祺大约 2 分钟springSpringMVC异常处理Java
ThreadLocal 详解:原理、场景与最佳实践

ThreadLocal 详解:原理、场景与最佳实践

引言

在 Java 并发编程中,经常面临两类问题:

  1. 上下文传递:某个信息(如用户 ID、请求 TraceId)需要在方法调用链中传递,但显式传参会导致接口臃肿
  2. 线程安全:某些工具类(如 SimpleDateFormat)非线程安全,但全局加锁又严重影响性能

ThreadLocal 是 JDK 提供的线程局部变量机制,通过"每个线程持有独立副本"的设计思想,优雅地解决了上述两个问题。


郑天祺大约 10 分钟java基础ThreadLocal并发编程Java
责任链模式

最近一直听大佬说责任链模式,决定看看到底是什么。本文由翻阅《大话设计模式》得

一、引言

	击鼓传花游戏,也称传彩球。中国民间游戏,流行于中国各地。数人、十数人或数十人围成一个圆圈席地而坐,另外一个人背对着人圈以槌击鼓。鼓响时,开始传花,花由一个人的手里传。

	有时候,花束就开始依次传递,鼓声一落,假如花束在某人手中,则该人就得饮酒(多是唱歌、跳舞、说笑话;或回答问题、猜谜、按纸条规定行事等)。

	击鼓传花便是责任链模式的应用。在责任链模式里,很多的对象由每一个对象对其下家的引用而联接起来形成一条链。

	请求在这个链上传递,直到链上的某一个对象决定处理此请求。发出这个请求的客户端并不知道链上的哪一个对象最终处理这个请求,这使得系统可以在不影响客户端的情况下动态地重新组织链和分配责任。

	在这个游戏中,参与游戏的人士具体处理者的对象,击鼓的人士客户端的对象。花代表请求。每个参加游戏的人有两个行为:(1)将花传下去(2)喝酒。击鼓的人不知道最终是哪个人执行了喝酒,但必然是做游戏的人们中的一个。

郑天祺大约 3 分钟设计模式设计模式责任链模式Java