Affectation de null à un objet avec une méthode en cours d'exécution

HANG:

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 userSessiona 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){});
}
Mumpitz:

userSessionest 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 userSessionpré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!

Je suppose que tu aimes

Origine http://43.154.161.224:23101/article/api/json?id=235243&siteId=1
conseillé
Classement