![](/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.