40 votes

Sécurité des threads des blocs statiques en Java

Disons que j'ai du code Java:

 public class SomeClass {
    static {
        private final double PI = 3.14;
        private final double SOME_CONSTANT = 5.76;
        private final double SOME_OTHER_CONSTANT = 756.33;
    }

  //rest of class
}
 

Si un thread instancie une instance de SomeClass et est en train d'initialiser les valeurs dans le bloc statique lorsqu'un deuxième thread instancie une deuxième instance de SomeClass, qu'arrive-t-il au bloc statique? Le deuxième thread l'ignore-t-il en supposant qu'il est déjà initialisé même si le premier thread n'est pas terminé? Ou quelque chose d'autre se produit-il?

51voto

Jon Skeet Points 692016

Si le premier thread n'a pas fini d'initialiser SomeClass, le deuxième thread se bloquera.

Ceci est détaillé dans la spécification du langage Java à la section 12.4.2 .

17voto

Dave Ray Points 20873

L'initialisation de classe statique est garantie pour être thread-safe par Java.

2voto

Chii Points 7798

attention à ce que vous n'appeliez pas de code nécessitant le verrouillage de la classe en cours d'initialisation - cela entraînerait un blocage. voir cet article de blog: http://ramblingabout.wordpress.com/2008/04/10/deadlock-quiz-the-answer/

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X