Ist java.util.Hashtable thread sicher?

7

Es ist eine Weile her, seit ich Hashtable für etwas Bedeutendes verwendet habe, aber ich erinnere mich, dass die Methoden get () und put () synchronisiert wurden.

Die JavaDocs spiegeln das nicht wider. Sie sagen einfach, dass die Klasse Hashtable synchronisiert ist. Was kann ich annehmen? Wenn mehrere Threads gleichzeitig auf die Hashtabelle zugreifen (vorausgesetzt, sie ändern nicht den gleichen Eintrag), sind die Operationen erfolgreich, oder? Ich denke, was ich frage ist "Ist java.util.Hashtable Thread sicher?"

Bitte hilf mir, aus diesem Problem herauszukommen ...

    
Saravanan 13.09.2011, 10:23
quelle

9 Antworten

11

Es ist threadsafe, weil die get, put, enthält Methoden usw. synchronisiert sind. Außerdem können mehrere Threads nicht gleichzeitig auf die Hashtabelle zugreifen, unabhängig davon, welche Einträge sie ändern.

edit - geändert, um die Bedingung zu berücksichtigen, dass die Synchronisation die Hashtabelle intern threadsicher macht, indem sie atomar modifiziert wird; Sie schützt nicht vor Konkurrenzbedingungen im externen Code, die durch den gleichzeitigen Zugriff auf die Hashtabelle durch mehrere Threads verursacht werden.

    
mcfinnigan 13.09.2011, 10:26
quelle
9

Für den allgemeinen Gebrauch ist es threadsicher.

Aber Sie müssen verstehen, dass es Ihre Anwendungslogik darum threadsicher macht. Für z.B. Ziehen Sie die Implementierung in Betracht, um einen Wert in eine Karte einzutragen, wenn sie nicht bereits vorhanden ist. Dieses Idiom wird putIfAbsent genannt. Es ist schwierig, dies threadsicher mit HashTable allein zu implementieren. Ähnlich für das Idiom ersetzen (k, V, V).

Daher würde ich für bestimmte Idiome wie putIfAbsent und ersetzen (K, V, V) die Verwendung von ConcurrentHashMap

    
Suraj Chandran 13.09.2011 10:28
quelle
3

Hashtable ist veraltet. Vergiss es. Wenn Sie synchronisierte Sammlungen verwenden möchten, verwenden Sie zu diesem Zweck den Collections.syncrhonize * () -Wrapper. Aber diese sind nicht zu empfehlen. In Java 5 wurden 6 neue gleichzeitige Algorithmen implementiert. Copy-on-Write-, CAS-, Lock-Free-Algorithmen. Für die Map-Schnittstelle gibt es zwei gleichzeitige Implementierungen. ConcurrentHashMap (gleichzeitige Hash-Map) und ConcurrentSkipListMap - gleichzeitige sortierte Map-Implementierung.

Der erste ist für das Lesen optimiert, so dass Aufrufe nicht blockiert werden, während die Tabelle aktualisiert wird. Schreibvorgänge arbeiten auch viel schneller im Vergleich zu synchronisierten Wrappern, da eine ConcurrentHashMap nicht aus einem, sondern aus einer Reihe von Tabellen besteht, die als Segmente bezeichnet werden. Es kann durch das letzte Argument im Konstruktor verwaltet werden:

%Vor%

ConcurrentHashMap ist in stark konkurrierenden Kontexten unentbehrlich, wo es weit besser funktioniert als jede verfügbare Alternative.

    
Alexandr 13.09.2011 10:53
quelle
2
  

Ich frage ist "Ist java.util.Hashtable thread sicher?".

Ja Hashtable ist threadsicher Wenn in Ihrer Anwendung kein Thread-Safe benötigt wird, dann gehen Sie durch HashMap, Falls eine threadsichere Implementierung gewünscht wird, dann wird empfohlen, anstelle von Hashtable ConcurrentHashMap zu verwenden.

    
subodh 13.09.2011 12:07
quelle
1

Beachten Sie, dass viele Antworten darauf hinweisen, dass Hashtable synchronisiert ist. aber das wird dir sehr wenig geben. Die Synchronisierung der Accessor / Mutator-Methoden verhindert, dass zwei Threads gleichzeitig hinzugefügt oder entfernt werden. In der realen Welt benötigen Sie jedoch häufig eine zusätzliche Synchronisierung.

Auch das Iterieren über die Einträge einer Hashtable ist nicht threadsicher, es sei denn, Sie verhindern auch, dass die Map durch zusätzliche Synchronisation geändert wird.

    
Umesh Awasthi 13.09.2011 10:34
quelle
1

Nein. Es ist 'threadsafe' nur in dem Maße, in dem seine Methoden synchronisiert sind. Es ist jedoch im Allgemeinen nicht threadsafe, und es kann nicht sein, da Klassen, die internen Status wie Iteratoren oder Aufzählungen exportieren, die Verwendung des internen Status erfordern, um ebenfalls synchronisiert zu werden. Deshalb sind die neuen Collections-Klassen nicht synchronisiert, da die Java-Designer erkannt haben, dass Thread-Sicherheit dem Benutzer der Klasse und nicht der Klasse selbst überlassen ist.

    
EJP 13.09.2011 10:29
quelle
0

Wenn Sie sich den Hashtable-Code ansehen, werden Sie sehen, dass die Methoden wie folgt synchronisiert werden:

%Vor%

Sie können weiterhin die Strg-Taste drücken (Befehl für Mac) und dann auf einen Methodennamen in der Eclipse klicken, um zum Java-Quellcode zu gelangen.

    
celik 17.04.2013 14:15
quelle
0

Im Gegensatz zu den neuen Auflistungsimplementierungen ist Hashtable synchronisiert. * Wenn keine threadsichere Implementierung benötigt wird, wird empfohlen, HashMap * anstelle von Hashtable zu verwenden. Wenn eine threadsichere, hochgradig gleichzeitige Implementierung gewünscht wird, wird empfohlen, ConcurrentHashMap anstelle von Hashtable zu verwenden.

Ссылка

    
Rollyng 07.11.2013 18:27
quelle
-2

Ja, Hashtable threadsicher, daher kann immer nur ein Thread auf eine Hashtabelle zugreifen

HashMap auf der anderen Seite ist nicht threadsicher (und daher 'schneller').

    
Augusto 13.09.2011 10:26
quelle

Tags und Links