3

Si j'utilise le GC stop-the-world et que je fais des choses dans ma méthode finalize(), puis-je supposer que tous les threads sont suspendus et que je peux faire ce que je veux et aucun thread n'osera moi sauf le fil du GC?Utilisation de la finalisation comme verrou exclusif

+2

* "aucun thread n'osera rivaliser" * - Je peux juste imaginer les pauvres petits threads d'applications qui tremblent dans le coin, en attendant que le gros et méchant vieux thread GC finisse :-) –

Répondre

4

Non, en fait, il peut même être plusieurs threads de finaliseur en cours d'exécution simultanément.

Depuis le java language spec, "Les finaliseurs peuvent être appelés dans n'importe quel ordre, ou même simultanément."

2

Non, vous ne pouvez pas - au moins autant que je comprends la mise en œuvre du point d'accès:

Au moins, c'est comment cela fonctionne avec un balayage marque & gc, mais je suis sûr qu'il est semblable à toutes les autres implémentations ainsi:

Après la phase de balayage, chaque objet finalisé non marqué est ajouté à une liste de travail avec son jeu de bits de marquage.

Ensuite, un agent d'arrière-plan parcourt cette liste et, après avoir terminé avec un appel de finalisation, efface le bit de marque afin qu'il soit effacé par le GC suivant. En conséquence, vous ne pouvez pas faire de suppositions sur QUAND la méthode finalize sera appelée (en fait, puisque le thread d'arrière-plan est probablement arrêté, vous pouvez être sûr que ce n'est pas lors d'une exécution GC!).

Maintenant, c'est un détail de mise en œuvre pour Hotspot et peut même varier entre les différentes implémentations de GC ..

Questions connexes