Java中的并发与多线程:高级机制

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

引言:从基础synchronized到现代工具



Java是少数从诞生之初就内置多线程支持的编程语言之一。然而在初级阶段,开发者往往局限于使用synchronized关键字和简单的Thread。在实际的高负载系统中,这远远不够:锁机制会产生死锁,而简单粗暴地创建线程会导致JVM过载。



本文将深入解析Java中的高级并发机制,帮助您编写高效、可扩展且安全的多线程代码。本文面向已掌握多线程基础(监视器、wait/notify、volatile)的开发者。



我们将探讨四个关键主题:用于递归任务的Fork/Join Framework、用于异步编程的CompletableFuture、作为ReadWriteLock替代方案的StampedLock,以及ThreadLocal的正确使用方式。






1. Fork/Join Framework:递归任务分解



Fork/Join Framework于Java 7中引入,旨在高效利用多核处理器解决可分解为子任务的问题(分治策略)。核心类是ForkJoinPool,它采用"工作窃取"(work-stealing)机制。



1.1. 工作原理

您无需手动创建线程,而是将任务描述为RecursiveTask(有返回值)或RecursiveAction(无返回值)的子类。然后递归地将任务拆分为子任务,直到它们足够小可以直接执行。



1.2. 示例:并行数组求和

import java.util.concurrent.RecursiveTask;import java.util.concurrent.ForkJoinPool;

public class SumTask extends RecursiveTask<Long> { private static final int THRESHOLD = 10_000; private final int[] array; private final int start, end;

public SumTask(int[] array, int start, int end) { this.array = array; this.start = start; this.end = end; }

@Override protected Long compute() { if (end - start <= THRESHOLD) { long sum = 0; for (int i = start; i < end; i++) { sum += array[i]; } return sum; } int mid = start + (end - start) / 2; SumTask left = new SumTask(array, start, mid); SumTask right = new SumTask(array, mid, end); left.fork(); // 异步启动左半部分 long rightResult = right.compute(); // 在当前线程计算右半部分 long leftResult = left.join(); // 等待左半部分结果 return leftResult + rightResult; }

public static void main(String[] args) { int[] data = new int[1_000_000]; for (int i = 0; i < data.length; i++) data[i] = i;

ForkJoinPool pool = ForkJoinPool.commonPool(); long result = pool.invoke(new SumTask(data, 0, data.length)); System.out.println("总和: " + result); }}


重要提示:请使用ForkJoinPool.commonPool()——它已根据CPU核心数进行了优化。除非必要,避免创建自定义线程池。






2. CompletableFuture:告别回调地狱的异步编程



在Java 8之前,异步编程可以通过Future实现,但它是同步的(阻塞调用get())。CompletableFuture解决了这个问题,提供了强大的函数式API来组合异步操作。



2.1. 基本场景

您可以创建CompletableFuture,异步执行任务,并通过链式调用组合它们:



import java.util.concurrent.CompletableFuture;

public cl

博客

书籍推荐