Thread sicher, aber verhindert nicht Deadlock? - Java, Multithreading, Klasse, Deadlock

Ich bin über diese Linie gestolpert, die das besagt"Obwohl alle Operationen Thread-sicher sind, führen Abrufvorgänge nicht zum Sperren, und es gibt keine Unterstützung für das Sperren der gesamten Tabelle in einer Weise, die jeglichen Zugriff verhindert" in der Gesamtbeschreibung der Java-Klasse [ConcurrentHashMap] (https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/ConcurrentHashMap.html). Meine Frage ist: Bedeutet das, dass die ConcurrentHasMap nicht die tote Sperre verhindert? Auch ich dachte thread-safe impliziert, dass kein totes Schloss stattfinden wird?

Antworten:

5 für die Antwort № 1

Sie geraten in die falsche Richtung: Wenn Sie ein Design erstellen, das gesperrt werden muss, öffnen Sie die Möglichkeit für tote Schlösser.

Das bedeutet nicht zwangsläufig, dass eine solche Architektur per se verwundbar ist.

Beispiel: Eine typische Deadlock-Situation ist, wenn Thread A die Sperre L1 hat und auf die Sperre L2 wartet; während Thread B L2 hält und L1 benötigt. Wenn du nur hast ein Objekt sperren, dann ist dieses Szenario eins ... das kann nicht passieren.

Mit anderen Worten: Sie verwenden Klasse X nicht verhindern Deadlocks. Das ist nicht möglich. Wenn überhaupt, verwenden Sie möglicherweise die Klasse X, weil sie Ihnen Funktionen bietet, die es Ihnen ermöglichen, ein "garantiert-dead-lock-free" -Design zu entwickeln!


4 für die Antwort № 2

Ein Deadlock kann nur dort auftreten sind zwei verschiedene Schlösser, d. h. wenn Sie ein Schloss halten und darauf warten, dass ein anderes Schloss freigegeben wird. (Es gibt jedoch mehr Bedingungen für Deadlocks).

Wie die ConcurrentHashMap versucht vermeiden Sperren Wenn möglich, können Sie keine Sperre mit Operationen erfassen nur auf der Karte, auf die die Karte warten kann. Daher verursachen nur Operationen auf der Karte keine Deadlocks.


Jedoch, Fadensicherheit bedeutet nicht Deadlock frei. Es garantiert nur, dass der Code entsprechend seiner Schnittstelle funktioniert, sogar wenn aus mehreren Threads aufgerufen. Eine Klasse threadsicher zu machen beinhaltet normalerweise hinzufügen Sperren, um eine sichere Ausführung zu gewährleisten.

Vielleicht möchten Sie auch einen Blick auf die Wikipedia-Artikel.


Speisekarte