我有一个方法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){});
}
答案 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秒钟,但仍在运行。
希望有帮助!