首页  

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使用手机热点 流量限制