为了账号安全,请及时绑定邮箱和手机立即绑定

java GC 是否考虑了在另一个线程中进行的引用?

java GC 是否考虑了在另一个线程中进行的引用?

温温酱 2021-11-11 13:33:51
假设定义了一个局部变量,然后传递给 Thread 构造函数,在那里它被保存为该线程的私有字段。然后,线程开始连续运行(基本上是永远),而原始方法结束。局部变量引用没了,但是GC有没有考虑到Thread对象存储的引用?我的场景类似于这个示例片段:...public static void Main(String... args) {  Foo foo = new Foo()  MyThread thread = new MyThread(foo)  ExecutorService executor = Executors.newSingleThreadExecutor();  executor.execute(thread)}...public class MyThread implements Runnable {  private Foo foo;  public MyThread(Foo foo) {     this.foo = foo;  }  public void run() {     while (true) {         this.foo.print(); // << throws NullPointerException         sleep(...)     }  }}
查看完整描述

1 回答

?
慕尼黑的夜晚无繁华

TA贡献1864条经验 获得超6个赞

简而言之,是的,GC确实考虑了存储在MyThread类中的引用,并且不会删除引用的对象。这是因为 Java 的垃圾收集器只会销毁无法访问的对象,即代码中任何地方都没有引用的对象(不完全是一般规则,请查看弱引用)。

该变量foo不是一个实际的对象,而是对一个对象的引用。当您传递fooMyThread的构造函数时,您不是在传递对象,而是对它的引用。在构造函数内部,您正在复制此引用并将其存储在MyThread. 由于run()该类的方法将“永远”运行(意味着 的实例MyThread“活着”),有问题的引用将“永远”活着,从而防止被引用的对象被垃圾收集。

请注意,MyThread's name 是错误的,可以这么说。它不会扩展Thread,因此,它不是一个线程。它只是Runnable接口的一个实现。更准确的名称是MyRunnable.


查看完整回答
反对 回复 2021-11-11
  • 1 回答
  • 0 关注
  • 175 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信