理解虚拟线程
#
JDK21中正式引入了虚拟线程,这是Java标准库首次正式支持用户态轻量级线程,它的出现让Java并发编程更加简单高效。这篇文章将深入探讨虚拟线程的概念和原理,帮助你更好的理解和使用虚拟线程。
为什么需要虚拟线程
#
在虚拟线程出现之前,Java中主要依靠线程(Thread)实现并发编程,通过将多个任务分配给多个线程来实现并发执行,每个线程具有独立的执行栈,一个线程就是一个并发执行单元。
而Java语言中的线程和操作系统中的线程是一一对应的,Java代码中每创建一个线程,JVM都会调用操作系统的API来创建一个操作系统线程并映射到Java线程。这种并发方式有以下特点:
...
笔者在过去主要使用的JDK版本是JDK8,最近在学习最新的JDK长期支持版本——JDK21,本文将简要记录一下JDK21相比于JDK8的一些新特性,对于一些比较有意思的新特性也会在后续文章中逐步展开研究。
var 关键字局部变量推断
#
// 仅限局部变量
var name = "zhangsan";
var age = 18;
var isMan = true;
var list = new ArrayList<String>();
var map = new HashMap<String, String>();
switch 表达式增强
#
// 假设有枚举定义为
public enum Direction {
EAST,
SOUTH,
WEST,
NORTH,
NORTHWEST,
;
}
// switch 表达式为变量赋值
var witchCity = switch (direction) {
case EAST, NORTHWEST -> "成都";
case WEST -> "上海";
case SOUTH -> "广州";
case NORTH -> "北京";
default -> throw new IllegalArgumentException("Invalid direction: " + direction);
};
// yield 关键字返回值,并跳出switch表达式(相当于break)
var witchCity = switch (direction) {
case EAST, NORTHWEST:
System.out.println("成都");
yield "成都";
case WEST:
System.out.println("上海");
yield "上海";
case SOUTH:
System.out.println("广州");
yield "广州";
case NORTH:
System.out.println("北京");
yield "北京";
default:
system.out.println("未知");
yield "未知";
};
// yield 关键字结合lambda表达式
var witchCity = switch (direction) {
case EAST, NORTHWEST -> {
System.out.println("成都");
yield "成都";
}
case WEST -> {
System.out.println("上海");
yield "上海";
}
case SOUTH -> {
System.out.println("广州");
yield "广州";
}
case NORTH -> {
System.out.println("北京");
yield "北京";
}
default -> {
System.out.println("未知");
yield "未知";
}
};
记录类(record class)
#
记录类的使用场景是存储数据,尤其是那些纯粹做数据传输的对象如DTO等,其每个字段都是不可变的。
...