CompletableFuture.runAsync 捕获和使用上下文变量
所属分类 java
浏览量 6
Java 的 Lambda 表达式要求捕获的局部变量必须是 final 或 effectively final。
final:显式声明不可修改的变量。
effectively final:变量初始化后未被重新赋值(即使对象内部状态被修改)。
Lambda 捕获的是变量引用,而非对象内部状态。
对象内部状态的修改(如 mutable.data = ...)不会影响 effectively final 的判断。
引用重新赋值(如 mutable = new Context())会导致编译错误,必须显式声明 final。
class Context {
String data = "Mutable";
}
Context mutable = new Context();
CompletableFuture.runAsync(() -> {
System.out.println("Mutable: " + mutable.data);
});
//
Context mutable = new Context();
// 编译错误:Lambda 表达式中使用的变量必须是 final 或 effectively final
mutable = new Context();
CompletableFuture.runAsync(() -> {
System.out.println(mutable.data);
});
import java.util.concurrent.*;
import java.util.concurrent.atomic.AtomicReference;
public class ContextExample {
public static void main(String[] args) {
// 不可变变量
String readOnly = "Read-Only";
CompletableFuture.runAsync(() -> {
System.out.println("Read-Only: " + readOnly);
});
// 可变变量(封装为对象)
class Context {
String data = "Mutable";
}
Context mutable = new Context();
CompletableFuture.runAsync(() -> {
System.out.println("Mutable: " + mutable.data);
});
// 可变变量(AtomicReference)
AtomicReference< String> atomicRef = new AtomicReference< >("Atomic");
CompletableFuture.runAsync(() -> {
System.out.println("Atomic: " + atomicRef.get());
});
// ThreadLocal 上下文
ThreadLocal< String> threadLocal = ThreadLocal.withInitial(() -> "ThreadLocal");
CompletableFuture.runAsync(() -> {
System.out.println("ThreadLocal: " + threadLocal.get());
});
}
}
上一篇
美国对外战争的真相
日俄战争 第零次世界大战
windows使用手机热点 流量限制