使用正在运行的方法为对象分配null

时间:2019-01-24 16:07:48

标签: java

我有一个方法disconnectUser(),该方法除其他外在执行结束时将null分配给对象userSession。但是,在我提出逻辑时出现了一种假设,其中说userSession有一个正在运行的方法,并且在它仍在执行时为其分配了空引用; 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;
    }
}

附录:

这是runEndlessLoop

的实现
public void runEndlessLoop(){
    Executors.newSingleThreadExecutor().execute(() -> while(true){});
}

1 个答案:

答案 0 :(得分:4)

userSession是对对象的引用。您将null“分配”给该引用,而不是对象。因此,您正在更改此参考。不会更改先前引用/指向的对象userSession

另请参阅:Can unreferenced objects still run if the garbage collector hasn't deleted them?

让我尝试添加一下:如果此对象的方法与程序的其余部分在同一线程中运行,则在该方法完成后后将更改引用,因此问题不会甚至都不来。
相反,如果此对象在不同的​​线程中起作用,那么...我刚刚对其进行了测试:

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秒钟,但仍在运行。

希望有帮助!