版本:基于 Java 17 & Java 21 LTS

在当今多核 CPU 的时代,编写高效的并发程序是每个开发者的必修课。Java 自诞生之日起就内置了多线程支持。本篇将从最基础的线程概念讲起,带你一步步跨向 Java 21 最具革命性的虚拟线程


1. 基础概念:Thread 与 Runnable

线程是程序执行的最小单位。在 Java 中,你可以通过实现 Runnable 接口或继承 Thread 类来创建线程。

// 现代推荐写法:使用 Lambda 表达式实现 Runnable
Runnable task = () -> {
    System.out.println("子线程正在运行: " + Thread.currentThread().getName());
};

Thread thread = new Thread(task);
thread.start(); // 启动线程

2. 线程池:ExecutorService (Java 5+)

在实际开发中,我们严禁显式创建线程(即 new Thread()),因为线程的创建和销毁开销巨大。现代 Java 推荐使用线程池。

import java.util.concurrent.Executors;

// 创建一个固定大小为 4 的线程池
try (var executor = Executors.newFixedThreadPool(4)) {
    executor.submit(() -> System.out.println("在线程池中执行任务"));
    // 在 Java 19+ 中,ExecutorService 实现了 AutoCloseable,可以使用 try-with-resources
}

3. 并发安全:synchronized 与 Lock

当多个线程同时访问共享资源时,会产生竞态条件(Race Condition)。

传统写法 (synchronized)

public synchronized void increment() {
    count++;
}

现代写法 (ReentrantLock)

import java.util.concurrent.locks.ReentrantLock;

private final ReentrantLock lock = new ReentrantLock();

public void safeIncrement() {
    lock.lock();
    try {
        count++;
    } finally {
        lock.unlock(); // 必须在 finally 中释放锁
    }
}

4. 革命性特性:虚拟线程 (Virtual Threads, Java 21 LTS)

这是 Java 21 最重磅的特性。传统的平台线程(Platform Threads)与操作系统线程 1:1 映射,数量受限(通常几千个就会撑爆内存)。

虚拟线程由 JVM 调度,极其轻量。你可以轻松开启 100 万个线程而不会导致系统崩溃。

// 创建一个为每个任务分配虚拟线程的 Executor
try (var executor = Executors.newVirtualThreadPerTaskExecutor()) {
    for (int i = 0; i < 10_000; i++) {
        executor.submit(() -> {
            // 模拟阻塞操作,如数据库查询或网络请求
            Thread.sleep(java.time.Duration.ofSeconds(1));
            return "Done";
        });
    }
} // 所有的虚拟线程会在这里自动等待完成

核心优势

  • 高并发:处理成千上万个并发请求不再需要复杂的异步编程模型。

  • 简单:你可以用最简单的阻塞式逻辑写出极其高效的代码。


5. 线程安全集合与原子类

在处理并发时,优先使用标准库提供的工具类:

  • 原子类AtomicInteger, AtomicLong(利用 CAS 保证性能)。

  • 并发集合ConcurrentHashMap, CopyOnWriteArrayList

import java.util.concurrent.atomic.AtomicInteger;

private AtomicInteger safeCount = new AtomicInteger(0);
safeCount.incrementAndGet(); // 原子性自增

本章小结

第十篇我们探讨了:

  1. 线程的基础创建方式。

  2. 为什么在现代开发中必须使用线程池。

  3. 如何利用 synchronizedLock 保护共享资源。

  4. 虚拟线程 (Virtual Threads):Java 并发编程的新时代。


结语

恭喜你!完成了这十篇 Java 现代开发系列博客。从基础语法到高并发实战,你已经掌握了 Java 开发最核心、最现代的知识体系。

接下来的路:

  • JVM 调优:理解内存模型 (JMM) 与垃圾回收 (GC)。

  • 设计模式:学会写出可维护、可扩展的代码。

  • 框架实战:深入学习 Spring Boot 3 / Spring Cloud 等工业级应用。

保持好奇,持续编码!