亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

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

使用正在運行的方法將 null 分配給對象

使用正在運行的方法將 null 分配給對象

守候你守候我 2022-05-21 16:41:37
我有一個方法,disconnectUser()除其他外,它在執行結束時分配null給一個對象。userSession但是,在我提出邏輯時出現了一個假設,其中 sayuserSession有一個正在運行的方法,并且在它仍在執行時被分配了一個空引用;JVM如何處理這種情況?FWIW 這里是一些上下文的代碼片段:public class A {    UserSession userSession;    /* Skipped irrelevant code    *-------------------------------    */    private void disconnectUser(){      //Runs an endless while-loop (it's for demonstration's sake)      userSession.runEndlessLoop();      userSession = null;    }}附錄:這是實現runEndlessLooppublic void runEndlessLoop(){    Executors.newSingleThreadExecutor().execute(() -> while(true){});}
查看完整描述

1 回答

?
泛舟湖上清波郎朗

TA貢獻1818條經驗 獲得超3個贊

userSession是對對象的引用。您“分配”null給這個引用,而不是一個對象。所以你正在改變這個參考。它不會更改userSession以前引用/指向的對象。


讓我試著補充一下:如果這個對象的方法與程序的其余部分在同一個線程中運行,則在此方法完成后引用將被更改,因此問題甚至不會出現。

相反,如果這個對象在不同的線程中起作用,那么......我剛剛測試了它:


public class UnreferencedTest {


    public static void main(String[] args) {

        UnreferencedTest u = new UnreferencedTest();

        u.createObject();

    }


    private void createObject() {


        Unreferenced obj = new Unreferenced();

        Thread t = new Thread(obj);//create new thread

        t.start();

        obj = null;     //remove only reference to object

        System.gc();    //ask GC to clean up


        try {

            Thread.sleep(10000); //wait a bit longer than other thread

        } catch (InterruptedException e) {

            e.printStackTrace();

        }

    }


    private class Unreferenced implements Runnable {

        @Override

        public void run() {

            try {

                Thread.sleep(5000);

                areYouStillHere();

            } catch (InterruptedException e) {

                e.printStackTrace();

            }

        }


        private void areYouStillHere() {

            System.out.println("I'm still here!");

        }

    }


}

...甚至“要求” GC 清理未引用的對象。(不保證會?。┧坏却?5 秒,但仍在運行。


希望有幫助!


查看完整回答
反對 回復 2022-05-21
  • 1 回答
  • 0 關注
  • 109 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號