2016-04-08 20 views
1
  1. Dies ist unter Multi-Threading
  2. Ich habe Themen über HashMap lesen und nicht relevanten Fragen finden können/Antworten

Der Code:Wie erklärt man doppelte Einträge in Java Hashmap?

private Map<String, String> eventsForThisCategory; 
    ... 
    Map<String, String> getEventsForThisCategory() { 
     if (eventsForThisCategory == null) { 
      Collection<INotificationEventsObj> notificationEvents = notificationEventsIndex.getCategoryNotificationEvents(getCategoryId()); 
      eventsForThisCategory = new HashMap<String, String>(); 
      for(INotificationEventsObj notificationEvent : notificationEvents) { 
       eventsForThisCategory.put(notificationEvent.getNotificationEventID(), notificationEvent.getNotificationEventName()); 
      } 
      logger.debug("eventsForThisCategory is {}", eventsForThisCategory); 
     } 
     return eventsForThisCategory; 
    } 

Der Ausgang:

app_debug.9.log.gz: 07 Apr 2016 13: 47: 06,661 DEBUG [WirePushNotificationSyncHandler :: WirePushNot ification.Worker-1] - eventsForThisCategory ist {FX_WIRE_DATA = Wichtige Wirtschaftsdaten, ALL_FX_WIRE = All, ALL_FX_WIRE = All, FX_WIRE_HEADLINES = Kritischer Schlagzeilen}

Wie es möglich ist?

+0

Mögliches Duplikat [Was passiert, wenn ein doppelter Schlüssel in eine HashMap gesetzt wird?] (Http://stackoverflow.com/questions/1669885/what-happens-when-a-duplicate-key-is-put-into -a-hashmap) –

+0

Nun, es ist nicht möglich. Nicht für eine 'HashMap ' zumindest. Welche Art von Nebenläufigkeit hat Ihr Code? Gibt es Leerzeichen, die sich zwischen den beiden 'ALL_FX_WIRE'-Schlüsseln unterscheiden? – Kayaman

+0

@Kayaman Es ist Multi-Threading. Es gibt keine Leerräume, die die 2 Schlüssel unterscheiden würden. Wie Sie sehen können, ist es die Karte ausdruckt, und ich glaube nicht, dass es für String – Volodia

Antwort

1

Ich bin ziemlich sicher, dass Ihre Karte zwei gleiche Schlüssel nicht zur gleichen Zeit haben. Was Sie sehen, ist ein Effekt der Modifizierung der Karte während itering iver es (in toString()). Wenn der zweite "ALL_FX_WIRE" geschrieben wird, ist der erste nicht mehr in der Karte vorhanden.

Sie wissen bereits, dass HashMap nicht threadsafe ist. Plus eventsForThisCategory kann von einem anderen Thread geändert werden, während eventsForThisCategory.toString() ausgeführt wird. Das muss also erwartet werden.

Stellen Sie sicher, eventsForThisCategory durch mehrere Threads zur gleichen Zeit nicht geändert (oder wechseln Sie zu ConcurrentHashMap), und stellen Sie sicher, dass es nicht während toString() läuft geändert wird (es wird aufgerufen, wenn Sie die Debug-Ausgabe erstellen).

+0

Ah richtig, ich habe total vergessen, dass ein 'toString' auch eine Iteration über die Map ist. Danke für die Antwort, – Volodia

0

HashMap ist nicht threadSafety in Multithreading. Sie können versuchen, Collections.synchronizedMap() zu verwenden, um Sie zu wickeln Hashmap Instanz oder die ConcurrentHashMap benutzen vielleicht besser

+0

Nicht die Antwort, die ich erwartet hatte. Du hast nicht erklärt, wie es passiert. – Volodia