Le modèle de double vérification est mentionné à l'article 48 du livre Effective Java, et il est souligné que ce modèle n'est généralement pas applicable en Java. La structure de ce modèle est la suivante:
Public Resource getResource () {if (ressource == null) {synchronisé (this) {if (ressource == null) {ressource = new Resource (); }}} RETOUR RESSOURCE; }Ce modèle est une amélioration du code suivant:
Public synchronisé ressource getResource () {if (ressource == null) {ressource = new Resource (); } RETOUR RESSOURCE; }Le but de ce code est de retarder l'initialisation des ressources. Mais chaque fois que vous y accédez, vous devez vous synchroniser. Afin de réduire les frais généraux de synchronisation, un mode double vérification est disponible.
La raison pour laquelle le mode à double vérification n'est pas valide en Java est que le type de référence n'est pas un file d'attente en l'absence de synchronisation. Pour les types de base, sauf le mode long et double, double, double vérification est applicable. Par exemple, le code suivant est correct:
Count int privé; public int getCount () {if (count == 0) {synchronisé (this) {if (count == 0) {count = composeCount (); // un calcul qui prend du temps}}} compte de retour; }Ce qui précède est la conclusion générale de l'idiome à double vérification en Java. Mais les choses ne sont pas encore terminées, car le modèle de mémoire de Java est également en cours d'amélioration. Doug Lea a écrit dans son article: "Selon le dernier modèle de mémoire Java JSR133, si le type de référence est déclaré volatile, le mode double vérification fonctionnera." Ainsi, à l'avenir, vous devez utiliser le mode double vérification en Java, vous pouvez utiliser le code suivant:
ressource privée de ressources volatiles; Public Resource getResource () {if (ressource == null) {synchronisé (this) {if (ressource == null) {ressource = new Resource (); }}} RETOUR RESSOURCE; }Bien sûr, ce doit être en Java qui suit la spécification JSR133.
Par conséquent, le double recouvre n'est pas disponible dans J2SE 1.4 ou les versions antérieures en raison des écritures hors service lors du réglage dans le multithread ou le JVM. Ce problème a été résolu dans J2SE 5.0, et le mot-clé volatil peut être utilisé pour assurer des singletons sous multi-threading.
classe publique singleton {instance privée singleton volatile = null; public singleton getInstance () {if (instance == null) {synchronisé (this) {if (instance == null) {instance = new singleton (); }} return instance; }}La méthode recommandée est le titulaire d'initialisation à la demande (IODH).
classe publique singleton {classe statique singletonholder {instance statique singleton = new singleton (); } public static singleton getInstance () {return singletonholder.instance; }}Ce qui précède concerne cet article, j'espère qu'il sera utile pour tout le monde d'apprendre la programmation Java.