19 708 Pages

L 'Verrouillage double vérification ou Verrouillage revérifié Il est l'un des plus sournoise antimodèle de la programmation concurrente, principalement dans Java. Au début, il semble un outil utile pour améliorer les performances, cependant, ce système ne fonctionnait pas avant l'introduction de la JavaMemoryModel[1].

exemple

public classe double-checked locking {
privé statique ressource _instance;
public statique ressource getInstance() {
si (_instance == nul) {
synchronisée (double-checked locking.classe) {
si (_instance == nul) {
_instance = nouveau ressource();
}
}
}
retour _instance;
}
}

bootstrapping un objet Il implique d'écrire quelques les variables (État de l'objet), de publier un objet se rapporte à l'écriture d'autres variables (la référence). Si vous ne garantit pas que l'initialisation d'un objet se produire avant un fil peut lire la référence, l'écriture de la référence peut être rangea avec les enregistrements d'état d'objet.

Dans ce cas, un thread peut voir une valeur mise à jour pour la référence, mais une valeur non mise à jour pour certaines des variables qui composent l'état de l'objet. Il obtient alors la référence à un objet partiellement construit.

Sans trop en utilisant des techniques élaborées et souvent inutile, vous pouvez le fixer avec le code suivant:

public classe EagerInstantiation {
privé statique finale ressource _instance = nouveau ressource();
public statique ressource getResource() {
retour _instance; // :-)
}
}

Une alternative est l'utilisation d'un booléen qui maintient l'état de l'initialisation de l'instance singleton. Cela évite les discussions simultanées peuvent obtenir une référence à l'instance avant le constructeur de l'objet a fini et fait l'objet comprenant:

public classe double-checked locking {
privé statique ressource _instance;
privé statique booléen initialisé = faux;
public statique ressource getInstance() {
si (!initialisé) {
synchronisée (double-checked locking.classe) {
si (!initialisé) {
_instance = nouveau ressource();
initialisé = faux;
}
}
}
retour _instance;
}
}

Le moment où se produit l'instruction d'affectation à la variable booléenne assure que la constructeur Il a terminé l'initialisation de l'objet. Même dans le scénario où le fil qui a initié la construction de l'objet est pas encore sorti de la section critique, tout autre concurrent de fil qui obtient un résultat négatif lors du premier test de la section critique, retournera directement (sans attendre mutex) L'objet initialisé correctement.

Cette solution au problème est donc basé sur l'idée de ne pas tester la référence directement à l'objet, mais une variable séparée qui a été fixé après la construction de l'objet.

notes

  1. ^ Le « verrouillage revérifié est brisé » Déclaration, sur www.cs.umd.edu. Récupéré le 25 Octobre, 2016.

bibliographie

  • réalité, Douglas C. Schmidt, Rapport C ++, SIGS, vol 8., N ° 3, Mars., 1996
  • Immobilisation Vérifié Double: Un modèle d'optimisation pour Efficacement Accès et objets sécurité Initializing fil, Douglas Schmidt et Tim Harrison. 3e Langues annuelles de modèle de conférence, la conception du programme 1996
  • Lazy instanciation, Philip Bishop et Nigel Warren, JavaWorld Magazine
  • Programmation threads Java dans le monde réel, Partie 7, Allen Holub, JavaWorld Magazine, Avril 1999.
  • Java 2 Performances et Idiom, Craig Larman et Rhett Guthrie, p100.
  • Java dans la pratique: Styles de conception et Idiomes pour Effective Java, Nigel Warren et Philip Bishop, P142.
  • Règle 99, Les éléments de Java style, Allan Vermeulen, Scott Ambler, Greg Bumgardner, Eldon Metz, Trvor Misfeldt, Jim Shur, Patrick Thompson, SIGS Reference Library

liens externes

fiber_smart_record Activités Wiki:
Aidez-nous à améliorer Wikipedia!
aller