2016-05-02 8 views
-1

Ich habe eine Methode, die eine Object ob als Parameter empfängt.
Diese Methode hat eine lokale HashMap<String, String> mp, die mit den Feldern ob gefüllt ist, ruft auch andere Methoden auf, die ob und mp als Parameter übergeben.Concurrency Problem mit einer lokalen hashmap

Das Problem ist, dass manchmal mp mit Feldern von verschiedenen ob Objekte gefüllt wird.

Ich denke mp Concurrency Probleme auftreten,
Was ist der beste Weg ist, zu synchronisieren mp zu wissen, dass es lokal ist gefüllt wird und als Parameter an verschiedenen Methoden übergeben werden, wie gut gefüllt werden.

Ich habe oder Steuerfäden nicht, wird die Anwendung in WebLogic Server bereitgestellt, so dass es durch einen Web Service aufgerufen wird, so viele Anrufe

+0

Code hinzufügen Bitte – Sanjeev

+0

Nebenläufigkeit wird nicht dazu führen, mp mit ob-Objekten zu füllen, es sei denn, es gibt einen Code, der das explizit tut. Code wäre hilfreich !!! –

+0

Der Code ist sehr lang, es ruft viele Methoden, die mp und ob als Parameter übergeben, keine Verwendung von Putting hier, während der Methode (und die aufgerufenen Methoden) die gleichen mp und ob sind übergeben und verwendet. . . – GingerHead

Antwort

1

Für solche Fälle haben Sie

java.util.concurrent.ConcurrentHashMap<K,V> 

Details here.

Kurz gesagt, ConcurrentHashMap funktioniert mit getrennten Blöcken, die unabhängig voneinander gesperrt werden, so dass keine anderen Threads darauf zugreifen können, bis die Arbeit erledigt ist (aber auf andere Blöcke zu dieser Zeit zugreifen kann). Die Standardblockgröße ist 16. Mehr dazu here.

Jetzt müssen Sie Kartengrößen verstehen, um über das Auffüllen zu sprechen. Die Standardgröße ist 16. Aber es gibt einen Ladefaktor von 0,75, das heißt, wenn die Karte 75% voll ist, wird die Größe auf das Doppelte der vorherigen Größe geändert, das heißt, neues Array neues Set von Schlüsseln erstellen und dann alles darauf kopieren (Wenn ich neues Set sage, meine ich die gleiche Logik für die Größenänderung). Nun, wenn Sie es schnell füllen, bedeutet, dass eine Menge Kopieren und für größere Größen, dauert es einige Zeit, so ist es besser, ihm eine große Anfangsgröße am Anfang zu geben, wie:

ConcurrentHashMap<String, Object> mp = new ConcurrentHashMapy<>(someLargeSize); 

Lassen someLargeSize sein die Reihenfolge von etwas, das Sie erwarten oder zumindest in der Nähe, so dass Sie die Größe auf ein Minimum reduzieren. Belastungsfaktor nicht berühren, es wird nur die Leistung verringern, 75% ist in Ordnung.

Und btw., Max Größe von HashMap und ConcurrentHashMap (und HashSet und Arraylist oder jede Array basierten Datenstruktur) in Java 1,073,741,824 ist, da die array[] im Hintergrund ist, DS in Java sind meist Wrapper nur mit spezifischen Funktionen dafür, aber ich bezweifle, dass Sie jemals diese Grenze erreichen werden, denn für Objekte, die einige Strings oder irgendetwas anderes enthält, benötigen Sie eine Menge von GB RAM für sie.

+0

Funktioniert das in der Weise, dass nur ein Thread auf diese lokale Map während der gesamten Methode zugreifen kann? – GingerHead

+0

hinzugefügt Antwort auf Ihre Frage, nach "Details hier" –

+0

Wie ti weiß, dass die Arbeit erledigt ist ?, Ich brauche es in seinem ganzen Leben zu sichern, ich meine von Anfang seiner Initialisierung in der Methode bis zu seiner Rückkehr, vorbei durch alle anderen Methoden, die von seinem Methodeneigner als Parameter aufgerufen werden – GingerHead