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

时间:2019-04-14 17:43:22

标签: java lambda garbage-collection method-reference

例如在给定的代码中,

@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对象将直到{{ 1}}已完成对他们的处理?

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

所以基本上我的问题是,传递实例方法引用为MyExecutor / Runnable / Callable的调用方对象是否对GC安全,直到传递的{{1} } / Consumer / Runnable有人提到他们吗?

1 个答案:

答案 0 :(得分:1)

好的。

这很简单:只要“活动”对象保留对其他对象X的引用,其他对象X就不适合进行垃圾收集。

可以安全地假设执行者跟踪提交给它的所有任务。任务完成后,不再需要对传递给它的任务/可运行文件的任何引用。因此执行者忘记了它,然后然后认为该任务/可运行程序有资格使用GC。

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