2016-07-16 9 views
3

ich vorübergehend halten will blockiert Benutzer in einer HashMap in Singleton befindet:Java Singleton auf Enum und ConcurrentHashMap. Thread-Sicherheitsprobleme?

public enum BlockedUsersRepository { 

    REPOSITORY; 

    private final ConcurrentMap<String, User> blockedUsers = new ConcurrentHashMap<String, User>(); 

    /* Static 'instance' method */ 
    public static BlockedUsersRepository getInstance() { 
      return REPOSITORY; 
    }} 

Ein Benutzer wird in die Karte immer nach einer Reihe von erfolglosen Versuchen Kartennummer einzugeben. Ich mache es mit den folgenden Methoden von User-Klasse starten:

public void addBlockedUser(User user) { 
      blockedUsers.put(user.getEmail(),user); 
    } 

    public void removeBlockedUser(User user) { 
      blockedUsers.remove(user.getEmail()); 
    } 

Die Frage ist: verpflichten ich GENUG Maßnahmen für Thread-Sicherheit? Wie kann ich den gleichzeitigen Zugriff auf die Karte im Terminal modellieren, um sicherzustellen, dass sie wirklich funktioniert oder fehlschlägt? Ist es überhaupt ein angemessener Ansatz, weil ich befürchte, dass es lahm ist, weil das Singleton eine Rolle einer Art globalen Variable spielt, die durch eine Anzahl von Benutzerinstanzen zugänglich/modifizierbar ist. Ich bin neu in der Nebenläufigkeit in Java und bitte Sie, nachsichtig zu sein. Vielen Dank.

Antwort

2

Die Enum als Singleton ist eine threadsafe Möglichkeit, eine zu erstellen. Sie haben final auf der ConcurrentMap, was zu diesem Zeitpunkt keine Probleme bedeutet.

ConcurrentHashMap kann nicht durch gleichzeitige Schreibvorgänge unterbrochen werden.

Ein gleichzeitiger addBlockedUser/removeBlockedUser kann dazu führen, dass der Benutzer blockiert oder entsperrt wird. Aber beide Ergebnisse sind in Ordnung, da Sie keine Einschränkung haben, dass ein Benutzer für mindestens x Sekunden blockiert werden muss, um nicht blockierbar zu sein.

Probleme, die vorhanden sein können, aber nicht direkt Threading-Probleme.

  • Haben Sie sichergestellt, dass die E-Mail eindeutig ist? Wenn nicht, kann nur einer dieser Benutzer gleichzeitig blockiert werden.
  • Haben Sie sichergestellt, dass die E-Mail nicht null ist? ConcurrentHashMap kann den Fall nicht behandeln und würde die Eindeutigkeit verletzen.
  • Wie gehen Sie mit dem Fall um, wenn jemand seine E-Mail ändert?
+0

Ich war hauptsächlich besorgt über Thread-Sicherheit, der Rest ist nicht so kritisch, da es nur ein Bildungsprojekt ist. Vielen Dank für die Unterstützung. –