![](/img/trans.png)
[英]Does a running thread in an object prevent it from being garbage collected in java?
[英]Does a dereferenced Java object still get garbage-collected if it started a thread which is still running?
请考虑以下情形:
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
。 该引用可防止垃圾回收。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.