gpt4 book ai didi

java - 如果取消引用的 Java 对象启动了一个仍在运行的线程,它是否仍会被垃圾收集?

转载 作者:行者123 更新时间:2023-11-29 05:55:57 25 4
gpt4 key购买 nike

考虑以下场景:

  • 一个对象 myObj 在一些函数 myFunc本地被实例化。
  • myObj 启动一个线程 someThread 运行一些后台任务,例如从套接字读取。
  • myFunc 然后返回,导致 myObj 被取消引用。

在正常情况下,JVM 只会对 myObj 进行垃圾回收。但是,如果 someThread 仍在运行,情况还会如此吗?

我知道 someThread 本身不会只要它还在运行,它就会被 GC,但在我的代码中它也需要访问存储在 myObj 中的值,因此确保 myObj 在运行时持续存在很重要。

最佳答案

一个对象只有在没有引用的情况下才有资格进行垃圾回收。您说 someThread 需要访问存储在 myObj 中的值,这意味着它必须具有对 myObj 的引用。这意味着 myObj 不符合垃圾回收条件,除非 someThread 也符合条件。

你可以保证一个对象永远不会从你下面被垃圾回收,所以,例如,这是非常安全的:

void foo() {
final Object something = new String("I'm alive!");
new Thread() {
public void run() {
try {Thread.sleep(10000);} catch (InterruptedException e) {}
System.out.println(something);
}
}.start();
}

something 被匿名线程引用,因此在匿名线程完成之前它不符合垃圾回收条件。

更具体地说,对于您的示例,这也是安全的:

void foo() {
new ThreadStartingObject("I'm alive!");
}

class ThreadStartingObject {
private String message;

public void ThreadStartingObject(String msg) {
this.message = msg;
new Thread() {
public void run() {
try {Thread.sleep(10000);} catch (InterruptedException e) {}
System.out.println(message);
}
}.start();
}
}

表示线程的匿名内部类隐式引用了外部this,即ThreadStartingObject 的实例。该引用可防止垃圾回收。

关于java - 如果取消引用的 Java 对象启动了一个仍在运行的线程,它是否仍会被垃圾收集?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12126894/

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