Variable d'Instance dans une classe Singleton accessibles par plusieurs threads
J'ai une classe singleton:
public class School {
private HashMap<String, String> students;
private static School school;
private School(){
students = new HashMap<String, String>();
}
public static School getInstance(){
if(school == null){
school = new School();
}
return school;
}
//Method to add student
protected void addStudent(String id, String name){
students.put(id,name);
}
//Method to remove student
protected void removeStudent(String id){
students.remove(id);
}
}
Comme vous pouvez le voir ci-dessus, dans la classe singleton, j'ai un students
variable (un HashMap
), il existe des méthodes pour ajouter & supprimer étudiant dans la classe.
Dans ma demande, il pourrait y avoir plusieurs threads à l'aide de cette School
classe de getInstance()
, puis les ajouter & retrait de l'étudiant. Pour rendre l'accès (en particulier l'accès à students
instance) être thread-safe, je pense à utiliser synchorized
mot-clé pour getInstanc()
méthode, comme:
public synchronized static School getInstance(){
if(school == null){
school = new School();
}
return school;
}
Mais je pense que mon trivial changement ne peut faire que seuls les un School
exemple être créé en multi-thread de l'environnement. De quoi dois-je faire pour le rendre thread-safe pour accéder à la students
instance par plusieurs threads ainsi. Toute suggestion ou commentaire est appreicated, merci!
- Lire ceci: stackoverflow.com/questions/11165852/...
- Est-initialisation exigence?
- Oui, l'initialisation différée est une exigence
- double possible de Ce qui est un moyen efficace de mettre en œuvre un pattern singleton en Java?
- Ne ConcurrentHashMap aider ? Il semble que c'est ce que vous avez besoin. docs.oracle.com/javase/7/docs/api/java/util/concurrent/...
- Pourquoi, @kocko & chrylis vous pensez que ma question est dupliqué avec vos liens. Il n'est PAS. Ma question est de mettre l'accent sur la table de hachage étudiants variable, pas sur la façon de vérifier qu'une École instance est créée en multi-thread de l'environnement. Veuillez vérifier ma question attentivement.
Vous devez vous connecter pour publier un commentaire.
Laissant la conversation que les singletons sont mal ou pas, considérons seulement le thread problèmes de sécurité dans votre
School
classe:School
; vous avez correctement identifié et résolu ce problème. Cependant, depuis l'initialisation deSchool
ne prend pas beaucoup de temps, vous pourriez aussi bien fairegetInstance()
trivial de lecture par l'initialisation de laschool = new School()
avec impatience.Student
objet, ils peuvent commencer à modifier simultanément. Par conséquent, laStudent
objet a besoin de la simultanéité de la protection de leur propre.Student
s' propriétés, mais pas ensemble, alors vous n'avez pas besoin de synchronisation.Synchronisation méthode rend thread-safe signifie qu'un seul thread peut exécuter cette méthode à la fois.
Cependant, dans la situation ci-dessus, je vous propose de synchronisés addStudent et removeStudent méthode uniquement. Ou vous pouvez synchronisé étudiants de hachage carte utilisez -
Collections.synchronizedMap(new HashMap());
Vous pouvez utiliser un ConcurrentHashMap ou un Les Collections.synchronizedMap
Cette article donne une bonne explication
La table de hachage de la mise en œuvre n'est pas thread-safe, les mauvaises choses peuvent se produire si plusieurs threads fonctionnent en même temps. Une solution rapide est prise de la carte elle-même synchronisé:
Notez que si vous itérer sur cette carte, l'itération doit également être fait dans un
synchronized
bloc; sinon, d'autres threads peuvent modifier la carte pendant que vous l'itération.Un thread-safe alternative à
HashMap
estConcurrentHashMap