gpt4 book ai didi

java - 使用运行方法将 null 分配给对象

转载 作者:行者123 更新时间:2023-11-30 06:41:55 25 4
gpt4 key购买 nike

我有一个方法,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){});
}

最佳答案

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

希望对您有所帮助!

关于java - 使用运行方法将 null 分配给对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54350855/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com