Quelles sont les différentes façons de briser un pattern singleton en Java
Quelles sont les différentes façons de briser un pattern singleton en Java.
Je connais une façon de dire que si nous n'avons pas synchroniser la méthode en singleton , alors nous pouvons créer plus d'une instance de la classe. Donc, l'application de la synchronisation. Est-il un moyen de briser singleton classe java.
public class Singleton {
private static Singleton singleInstance;
private Singleton() {
}
public static Singleton getSingleInstance() {
if (singleInstance == null) {
synchronized (Singleton.class) {
if (singleInstance == null) {
singleInstance = new Singleton();
}
}
}
return singleInstance;
}
}
en fait, ce code est incorrect, le non initialisée Singleton peut être attribué à instance unique avant que le constructeur finitions
retiré ee balise comme il n'y a rien ee spécifique sur cette question
tu veux dire
non, je veux dire que l'allocation d'un objet est stocké dans
Gotcha 🙂
retiré ee balise comme il n'y a rien ee spécifique sur cette question
tu veux dire
private static Singleton singleInstance= new Singleton()
?non, je veux dire que l'allocation d'un objet est stocké dans
singleInstance
avant l'exécution du constructeur, cela signifie qu'un autre thread peut accéder à la non initialisée singleton, ce qui peut conduire à des erreursGotcha 🙂
OriginalL'auteur Harsha_2012 | 2013-12-06
Vous devez vous connecter pour publier un commentaire.
De départ avec votre code, "une Double vérification de Verrouillage" peut être interrompu à un certain environnement,
Lorsqu'il est exécuté sur un système à l'aide de Symantec JIT, ça ne fonctionne pas. En particulier, Symantec JIT compile
à la suivante (notez que Symantec JIT à l'aide d'une poignée d'objets basé sur le système d'attribution).
Comme vous pouvez le voir, l'affectation à des singletons[i].de référence est effectuée avant le constructeur de Singleton est appelé. C'est tout à fait légale en vertu de la Java du modèle de mémoire, et aussi juridique en C et C++ (car aucun d'entre eux ont un modèle de mémoire).
http://www.cs.umd.edu/~pugh/java/memoryModel/DoubleCheckedLocking.html
En dehors de cela
Serializable
Reflection
(je crois)*Comment voulez-vous résoudre les contrevenants?
vous pouvez remplacer
readResolve()
méthode dans votre classe et de jeter l'exceptionvous pouvez overrride
clone()
et de le jeterCloneNotSupported
exceptionExemple
Après tout, je suggère d'utiliser Enum comme le moyen le plus sûr pour Singleton (Depuis java5 la meilleure façon de le faire est d'utiliser un enum)
if(singleInstance!=null)throw new RuntimeError();
dans le constructeurmise à jour de la réponse 🙂
OriginalL'auteur Satheesh Cheveri
En fait d'un coffre-fort dans la version sans la nécessité pour la synchronisation est la version avec un imbriquée titulaire de la classe:
D'autres versions sont:
Désireux d'initialisation
Enum Singleton
Toutes ces versions ont des avantages et des inconvénients, mais aucun d'entre eux besoins explicites de synchronisation, car ils reposent tous sur le chargeur de classe et dans le Fil de sécurité.
Que les autres ont écrit, que vous pouvez briser certains de ces modèles par l'intermédiaire de la Désérialisation. Lire Efficace Java par Joshua Bloch (Articles 74 à 78) sur la prévention de telles attaques (enum pattern singleton est sûr contre de telles attaques de la boîte).
oui, exactement
peut-on utiliser des bloc plutôt statique de la classe ?
oui, mais alors nous avons hâte d'initialisation. Mais bien sûr ratchet_freaks commentaire s'applique ici aussi
OriginalL'auteur Sean Patrick Floyd
Une façon est de Sérialisation. Si vous n'implémentez pas readResolve puis la lecture d'un singleton avec ObjectInputStream.readObject() va renvoyer une nouvelle instance de ce singleton.
OriginalL'auteur Evgeniy Dorofeev
Autant que je sache, il y a deux façons cela peut être brisé
L'Aide De La Réflexion
Lorsqu'il existe des chargeurs de classes, plus d'un (c'est à dire chargeur de classe parent).tous les singletons doivent être chargés en commun chargeur de classe parent.
Je viens de googlé, ce lien vous aidera à vous - blog.yohanliyanage.com/2009/09/breaking-the-singleton
OriginalL'auteur Keerthivasan
** Singleton Test **
OriginalL'auteur Deepak
Classe cls = Singleton.class;
OriginalL'auteur Dharma
Le Multithreading est le plus gros problème avec les singletons.
Vous pouvez éviter cela en synchronisant ou en utilisant désireux d'initialisation.
Un autre moyen serait d'utiliser un singleton où vous n'êtes pas censé le faire. En utilisant le pattern singleton vous pouvez l'appliquer d'une manière qui entrave votre programme de développement plus tard. (E. G, la création d'un singleton "joueur" dans un jeu, parce que vous supposez que c'est un mode solo du jeu. Prochaine étape dans le développement de la "co-op "fonctionnalités").
Le pattern singleton a ses avantages, mais ne l'utilisez pas sans attention considération.
OriginalL'auteur Dylan Meeus
Une remarque d'abord: Il serait mieux dans ce cas, principalement pour des raisons de lisibilité, pour rendre l'ensemble
getSingleInstance() { }
synchronized
:Autre que cela, je ne pense pas que c'est facile de casser le code. Bien sûr, si vous ajoutez les appels récursifs, alors il est possible de le casser, comme ceci:
Singleton
'constructeur.Singleton
instance.Mais c'est la seule chose que je peux penser, et vous ne pouvez pas vous protéger de l'
Singleton
classe.OriginalL'auteur skiwi
Synchronisée approche de travail, mais aussi de ralentir tous les accès au singleton pour protéger quelque chose qui n'arrive jamais dans le premier accès.
Le plus simple et le plus sûr, c'est juste pour faire désireux d'initialisation, qui est toujours sûr que Java garantit à toutes les variables membres sont mis en avant, il permet à quiconque d'y accéder.
Votre approche actuelle est cassé, même avec votre synchronisé en boucle parce que double-vérifier le verrouillage est cassé. Vous devez marquer le singleton variable comme
volatile
si vous allez l'utiliser pour le double-vérifier le verrouillage car sinon il y a toujours des moyens pour les threads d'accéder à une incomplètement-initialisé objet. Voir http://en.wikipedia.org/wiki/Double-checked_locking#Usage_in_Java pour plus de détails.OriginalL'auteur Tim B
Supposons que vous avez mis en œuvre classe Singleton "SingletonPattern" comme ci-dessous.
package com.exemple.modèle;
Maintenant, vous pouvez vous briser le Singleton comportement de cette classe en utilisant l'approche suivante.
OriginalL'auteur Kuldeep Singh