gpt4 book ai didi

java - Runnable 中的方法引用使对象 GC 安全吗?

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:45:07 25 4
gpt4 key购买 nike

例如在给定的代码中,

@Singleton
public class MyExecutor {

ExecutorService executorService;

public void execute(Runnable runnable) {
executorService.submit(runnable);
}
}

class A {
public void a(String x) {
// do something
}

MyExecutor executor;

// Injected via DI, always is same object
A(MyExecutor executor) {
this.executor = executor;
}

public void run() {
executor.execute(() -> a("Whatever"));
}
}

所以我的问题是假设我非常频繁地创建 A 并调用它们的 a.run() 然后忘记它,我的 A 对象在 MyExecutor 完成处理之前不会被 GC 收集?

在我看来应该是这样,否则 MyExecutor 怎么知道要执行哪个实例?

所以基本上我的问题是,调用者对象是否将实例方法引用作为 Runnable/Callable/Consumer..etc 传递GC 安全,直到传递的 Runnable/Callable/Consumer 有人持有对它们的引用?

最佳答案

当然可以。

这很简单:只要“Activity ”对象保持对某个其他对象 X 的引用,其他对象 X 就没有资格进行垃圾回收。

并且可以安全地假设执行者跟踪提交给它的所有任务。任务完成后,不再需要任何对传递给它的任务/可运行对象的引用……。所以执行者忘记了它,然后那个任务/可运行的就符合 GC 的条件。

请注意:没有“方法引用”对象!方法引用或 lambda 基本上是某个类(Task 或 Runnable,例如取决于上下文)的对象。方法引用首先是一个语法元素!

关于java - Runnable 中的方法引用使对象 GC 安全吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55678219/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com