第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

java GC 是否考慮了在另一個線程中進行的引用?

java GC 是否考慮了在另一個線程中進行的引用?

溫溫醬 2021-11-11 13:33:51
假設定義了一個局部變量,然后傳遞給 Thread 構(gòu)造函數(shù),在那里它被保存為該線程的私有字段。然后,線程開始連續(xù)運行(基本上是永遠),而原始方法結(jié)束。局部變量引用沒了,但是GC有沒有考慮到Thread對象存儲的引用?我的場景類似于這個示例片段:...public static void Main(String... args) {  Foo foo = new Foo()  MyThread thread = new MyThread(foo)  ExecutorService executor = Executors.newSingleThreadExecutor();  executor.execute(thread)}...public class MyThread implements Runnable {  private Foo foo;  public MyThread(Foo foo) {     this.foo = foo;  }  public void run() {     while (true) {         this.foo.print(); // << throws NullPointerException         sleep(...)     }  }}
查看完整描述

1 回答

?
慕尼黑的夜晚無繁華

TA貢獻1864條經(jīng)驗 獲得超6個贊

簡而言之,是的,GC確實考慮了存儲在MyThread類中的引用,并且不會刪除引用的對象。這是因為 Java 的垃圾收集器只會銷毀無法訪問的對象,即代碼中任何地方都沒有引用的對象(不完全是一般規(guī)則,請查看弱引用)。

該變量foo不是一個實際的對象,而是對一個對象的引用。當您傳遞fooMyThread的構(gòu)造函數(shù)時,您不是在傳遞對象,而是對它的引用。在構(gòu)造函數(shù)內(nèi)部,您正在復制此引用并將其存儲在MyThread. 由于run()該類的方法將“永遠”運行(意味著 的實例MyThread“活著”),有問題的引用將“永遠”活著,從而防止被引用的對象被垃圾收集。

請注意,MyThread's name 是錯誤的,可以這么說。它不會擴展Thread,因此,它不是一個線程。它只是Runnable接口的一個實現(xiàn)。更準確的名稱是MyRunnable.


查看完整回答
反對 回復 2021-11-11
  • 1 回答
  • 0 關注
  • 205 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網(wǎng)微信公眾號