gpt4 book ai didi

java - 即使我在另一个线程中使用它,GC 是否可以在这里收集我的变量?

转载 作者:行者123 更新时间:2023-12-01 16:36:28 24 4
gpt4 key购买 nike

假设我创建这个 Test 类的实例,它使用嵌套类启动一个新线程:

public class Test
{
private String _str;

public Test()
{
_str = "Hello world !";
new TestThread().start(); // Start a background thread
}


private class TestThread extends Thread
{
public void run()
{
while (true)
{
System.out.println(_str);
Thread.sleep(1000);
}
}
}
}

如果我删除对 Test 实例的任何强引用,现在会发生什么?后台线程仍然存在,并且会继续打印_str变量,但恐怕GC可以随时收集它。

当然,我可以创建引用的本地副本(使用构造函数:public TestThread(String str)并将其存储在本地变量中),但我想知道这是否有必要。

最佳答案

TestThread本身具有Test的强引用,因此只要它不可收集,Test<的实例 不可收集。由于它是一个正在运行的线程,因此 TestThread 的实例显然不可用于收集。

当您创建非静态内部类 (TestThread) 时,该类的每个实例都有对其封闭类 (Test) 实例的隐式引用

请参阅 Nested Classes Java Tutorial 的内部类部分.

您不必“害怕”GC 可能会做什么。它不会收集您可能引用的对象,除非您不遗余力地使用弱引用。

关于java - 即使我在另一个线程中使用它,GC 是否可以在这里收集我的变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8493169/

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