singleton et public static variable Java
J'ai 2 options:
- Le Pattern Singleton
class Singleton{ private static Singleton singleton = null; public static synchronized Singleton getInstance(){ if(singleton == null){ singleton = new Singleton(); } return singleton; } }
- à l'aide d'un
static final
champprivate static final Singleton singleton = new Singleton(); public static Singleton getSingleton() { return singleton; }
Quoi la différence? (single thread ou multithread)
Mises à jour: je suis au courant du projet de Loi Pugh ou enum
méthode.
Je ne suis pas la recherche de la bonne façon, mais je ne l'ai utilisé 1. Est-il vraiment une différence b/w 1 ou 2?
Après la mise à jour de votre question pas de différence.
cette question n'a rien à voir avec singleton. vous vous posez au sujet de l'accès à un champ statique de synchroniser ou non synchronisé avec le contexte. modifier les balises s'il vous plaît.
Je suis en désaccord que la première option de verrouillage de chaque thread qui tente de récupérer l'instance et est donc légèrement moins performant.
ses pas une bonne pratique à utiliser
cette question n'a rien à voir avec singleton. vous vous posez au sujet de l'accès à un champ statique de synchroniser ou non synchronisé avec le contexte. modifier les balises s'il vous plaît.
Je suis en désaccord que la première option de verrouillage de chaque thread qui tente de récupérer l'instance et est donc légèrement moins performant.
ses pas une bonne pratique à utiliser
synchronized
un tous votre méthode. synchronized
mise en œuvre est très cher. J'ai posté en vertu d'autres de meilleur moyen d'utiliser un Singleton pour le multithreadingOriginalL'auteur Achow | 2012-12-05
Vous devez vous connecter pour publier un commentaire.
La principale différence est que, avec la première option , le singleton ne seront initialisées lors de la
getInstance
est appelé, alors qu'avec la deuxième option, il sera initialisé dès que le contenant de classe est chargé.D'un tiers (de préférence) en option, qui est paresseux et thread-safe est d'utiliser un enum:
OriginalL'auteur assylias
Il y a une différence:
Solution 1 est un paresseux de l'initialisation, l'instance du singleton sera créé sur le premier invoquer de
getInstance
La Solution 2 est un désireux de l'initialisation, l'instance du singleton sera créé lorsque la classe loades
Ils sont thread-safe, l'appel de la deuxième multithread est un peu trompeur
OriginalL'auteur Aviram Segal
Le 1er solutions semble être lazier, mais en fait non.
Une classe est initialisée quand une méthode statique/champ est accessible pour la 1ère fois.
Il est probable que
getInstance()
est la seule accessible au public méthode statique de la classe. C'est le point de singleton.Puis la classe est initialisée lorsque quelqu'un appelle
getInstance()
pour la 1ère fois. Cela signifie que les deux solutions sont essentiellement les mêmes dans la paresse.Bien sûr, la 2e solutions regarde mieux et plus performant.
dans la 2ème solution, l'instance n'est créé que lorsque la classe est initialisée; la classe est initialisée uniquement lorsqu'une méthode statique/champ est accessible, c'est à dire, lorsque getInstance() est invoquée.
OriginalL'auteur irreputable
Donc, avec la mise à jour des deux options ci-dessus sont thread-safe. Cependant, le
synchronized
option exige que chaque thread qui appelleinstance
pour acquérir ce verrou réduisant ainsi les performances, si cela est fait beaucoup. Aussi, à l'aide desynchronized
au niveau de la méthode a le potentiel d'émission de l'aide à la disposition du public de verrouillage (la classe elle-même) qu'en conséquence, si un thread, il acquiert ce verrou (qu'il le pouvait), vous pourriez vous retrouver avec blocage. Lestatic final
option est plus performant mais ne fait pas d'initialisation du singleton (ce qui pourrait ne pas être un problème selon le système).Une autre option qui permet de thread-safe paresseux init du Singleton est comme suit:
Cela fonctionne parce que la statique à l'intérieur de la classe est garantie d'être initialisé avant n'importe quelle méthode de la classe conteneur est exécutée.
Je viens de relire la réponse, et il n'a pas le problème j'ai pensé qu'il avait. Désolé combat. 🙂 Supprimé mon -1. La réponse ressemble un peu à une salade de mots pour moi, si...et touche à peine sur la vraie différence (paresseux vs désireux d'initialisation). Vous mentionnez la performance et de blocage, mais ceux qui ne sont pas la principale différence.
OriginalL'auteur John B
Singleton mise en œuvre en Java (si vous voulez vraiment un) peut être effectuée d'une façon plus élégante que vous avez décrite, pour à la fois désireux et l'initialisation tardive. Vérifier l'enum façon décrit par Joshua Bloch et la solution SingletonHolder proposé par le projet de Loi Pugh, respectivement.
L'article de wikipédia est aussi un bon point de départ pour la compréhension du modèle et de ne répondre à votre question.
Oui, vous avez raison...
OriginalL'auteur Costi Ciudatu