J'ai une méthode, disconnectUser()
qui , entre autres choses, attribue null
à un objet userSession
à la fin de l' exécution. Cependant, une hypothèse a surgi que je montais la logique, où par exemple userSession
a une méthode en cours d' exécution et il est affecté une référence nulle alors qu'il est encore en cours d' exécution; Que fait la machine virtuelle Java avec une telle situation?
FWIW voici quelques extraits de code pour le contexte:
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;
}
}
ADDENDA:
Voici la mise en œuvre runEndlessLoop
public void runEndlessLoop(){
Executors.newSingleThreadExecutor().execute(() -> while(true){});
}
userSession
est une référence à un objet. Vous « Assign » null
à cette référence, et non à un objet. Donc , vous changez cette référence. Il ne change pas l'objet userSession
précédemment référencé / pointé.
Voir aussi: Can objets non référencés encore courir si le garbage collector ne les a pas supprimé?
Permettez - moi d'ajouter ceci: Si la méthode de cet objet est en cours d' exécution dans le même fil que le reste de votre programme, la référence serait changé après cette méthode se termine, de sorte que le problème ne vient même pas.
Si, au contraire, cet objet agit dans un thread différent, eh bien ... je viens testé:
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!");
}
}
}
... et même « demandé » le GC pour nettoyer les objets non référencés. (Aucune garantie qu'il fait!) Il attend que pendant 5 secondes, mais fonctionne toujours.
J'espère que cela pourra aider!