Il est indiqué que l'affectation des champs est toujours atomique, sauf pour les champs de long ou double.Pourquoi le verrouillage à double vérification est-il cassé en Java?
Mais, quand je lis une explication des raisons pour lesquelles le verrouillage à double contrôle est cassé, il est dit que le problème est en opération d'affectation:
// Broken multithreaded version
// "Double-Checked Locking" idiom
class Foo {
private Helper helper = null;
public Helper getHelper() {
if (helper == null) {
synchronized(this) {
if (helper == null) {
helper = new Helper();
}
}
}
return helper;
}
// other functions and members...
}
- Discussion A avis que la valeur n'est pas initialisé , donc il obtient le verrou et commence à initialiser la valeur .
- En raison de la sémantique de certains langages de programmation, le code généré par le compilateur est autorisé pour mettre à jour la variable partagée pour pointer vers un objet partiellement construit avant A a fini d'effectuer l'initialisation .
- Le thread B remarque que la variable partagée a été initialisée (ou alors apparaît) et renvoie sa valeur. Étant donné que thread B croit que la valeur est déjà initialisé, il pas acquérir le verrou. Si B utilise l'objet avant tout l'initialisation fait par A est vu par B (soit parce qu'un n'a pas terminé l'initialisation ou parce que certaines des valeurs initialisées dans l'objet ont pas encore percolé à la mémoire B utilise (cache cohérence)), le programme va probablement crash.
(à partir de http://en.wikipedia.org/wiki/Double-checked_locking).
Quand est-ce possible? Est-il possible que l'opération d'assignation JVM 64 bits ne soit pas atomique? Si non alors si le "double-checked locking" est vraiment cassé?
Aucune différence sur les JVM 64 bits. – rapadura
duplicata possible de http://stackoverflow.com/questions/12448864/java-double-locking-can-someone-explain-more-simply-why-intuition-wouldnt-wor/12449110?noredirect=1#comment26446551_12449110 –