簡體   English   中英

如果解除引用的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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM