Comment résoudre le “Double-Vérifier le Verrouillage est Cassé” Déclaration en Java?

Je veux mettre en œuvre l'initialisation tardive pour le multithreading en Java.

J'ai un code du genre:

class Foo {
    private Helper helper = null;
    public Helper getHelper() {
        if (helper == null) {
            Helper h;
            synchronized(this) {
                h = helper;
                if (h == null) 
                    synchronized (this) {
                        h = new Helper();
                    } //release inner synchronization lock
                helper = h;
            } 
        }    
        return helper;
    }
    //other functions and members...
}

Et je suis de la "Double-Vérifier le Verrouillage est Cassé" de la déclaration.

Comment puis-je résoudre ce problème?

  • Double-vérifier le verrouillage a été résolu, vérifiez Efficace Java 2nd Edition pour plus de détails sur la façon de le faire.
  • Vous n'avez pas besoin de l'intérieur de synchroniser déclaration, en tout cas, puisque vous êtes déjà dans une.
  • C'est seulement un problème si les nouveaux Auxiliaires() ne peut jamais lever une exception. Jamais un OOME. S'il y a un nouvel Objet() dans le constructeur, alors il n'est pas un problème. Le constructeur doit également pas vide. Si le constructeur est simple, alors il est plus simple de créer l'objet n'est pas paresseux.