/ / Wenn alle Sammlungsattribute thread-sicher sind, können wir sagen, dass diese Sammlung thread-sicher ist? - Java, Sammlungen, Thread-Sicherheit

Wenn alle Sammlungsattribute threadsicher sind, können wir dann sagen, dass diese Sammlung threadsicher ist? - Java, Sammlungen, Thread-Sicherheit

Wenn alle Attribute (oder Elementfelder oder Datenelemente) einer Java-Sammlung sind fadensicher (CopyOnWriteArraySet,ConcurrentHashMap, BlockingQueue, ...) können wir sagen, dass diese Sammlung ist fadensicher ?

ein beispiel:

public class AmIThreadSafe {

private CopyOnWriteArraySet thradeSafeAttribute;

public void add(Object o) {
thradeSafeAttribute.add(o);
}

public void clear() {
thradeSafeAttribute.clear();
}
}

In diesem Beispiel können wir das sagen AmIThreadSafe ist fadensicher ?

Antworten:

2 für die Antwort № 1

Kurze Antwort: Nein.

Etwas längere Antwort: Da add () und clear () in keiner Weise synchronisiert sind und HashSet nicht selbst synchronisiert ist, können sich mehrere Threads gleichzeitig in ihnen befinden.

Bearbeiten Sie den folgenden Kommentar: Ah. Nun lautet die kurze Antwort Ja, irgendwie. :)

Der Grund für die "sorta" (amerikanischer SlangTeilweise bedeutet dies übrigens, dass es möglich ist, dass zwei Operationen atomar sicher sind, aber unsicher, wenn sie in Kombination verwendet werden, um eine zusammengesetzte Operation zu erstellen.

In Ihrem Beispiel, in dem nur add () und clear () unterstützt werden, kann dies nicht passieren.

Stellen Sie sich jedoch in einer vollständigeren Klasse, in der wir mehr von der Erfassungsschnittstelle haben würden, einen Aufrufer vor, der dem Satz einen Eintrag hinzufügen muss, wenn der Satz bereits nicht mehr als 100 Einträge enthält.

Dieser Aufrufer möchte eine Methode wie die folgende schreiben:


void addIfNotOverLimit (AmIThreadSafe set, Object o, int limit) {
if (set.size() < limit)      // ## thread-safe call 1
set.add(o);               // ## thread-safe call 2
}

Das Problem ist, dass dabei jeder Anruf für sich istThread-sicher, zwei Threads könnten sich in addIfNotOverLimit befinden (oder, im Übrigen, über eine andere Methode), und daher würde Thread A size () aufrufen und 99 erhalten und dann add () aufrufen, aber bevor dies passiert, könnte es unterbrochen werden und Thread B könnten dann einen Eintrag hinzufügen, und nun würde die Menge über ihrem Limit liegen.

Moral? Zusammengesetzte Operationen machen die Definition von "threadsicher" komplexer.


3 für die Antwort № 2

Unter "Attributen" versteht man "was die Sammlung enthält", also nein. Nur weil die Collection threadsichere Gegenstände hält, bedeutet nicht, dass die Collection"s Implementierung implementiert add(), clear(), remove()usw. in einer thread-sicheren Weise.


2 für die Antwort № 3

Nein, weil der Zustand eines Objekts die "Summe" aller seiner Attribute ist.

Zum Beispiel könnten Sie 2 thread-safe habenSammlungen als Attribute in Ihrem Objekt. Darüber hinaus kann Ihr Objekt von einer Korrelation zwischen diesen beiden Sammlungen abhängen (z. B. wenn sich ein Objekt in einer Sammlung befindet, befindet es sich in der anderen Sammlung und umgekehrt). Die einfache Verwendung von 2 thread-sicheren Sammlungen stellt nicht sicher, dass die Korrelation zu allen Zeitpunkten wahr ist. Sie benötigen eine zusätzliche Parallelitätssteuerung in Ihrem Objekt, um sicherzustellen, dass diese Einschränkung für die beiden Auflistungen gilt.

Da die meisten nicht trivialen Objekte über ihre Attribute hinweg eine Art Korrelationsbeziehung aufweisen, reicht es nicht aus, threadsichere Auflistungen als Attribute zu verwenden, um ein Objekt threadsicher zu machen.


1 für die Antwort № 4

Was ist Fadensicherheit?

Fadensicherheit bedeutet einfach, dass die Felder eines Objekts oder einer Klasse immer einen gültigen Zustand beibehalten, wie von andere Objekte und Klassen, auch wenn Wird von mehreren Threads gleichzeitig verwendet.

Ein threadsicheres Objekt ist eines davon behält immer einen gültigen Zustand bei, wie beobachtet von anderen Klassen und Objekten, auch in einer Umgebung mit mehreren Threads.

Gemäß der API-Dokumentation müssen Sie diese Funktion verwenden, um die Thread-Sicherheit zu gewährleisten:

synchronizedCollection(Collection c)
Returns a synchronized (thread-safe) collection
backed by the specified collection

Wenn Sie das lesen, ist es meine Meinung, dass Sie müssenVerwenden Sie die obige Funktion, um eine thread-sichere Sammlung sicherzustellen. Sie müssen sie jedoch nicht für alle Sammlungen verwenden, und es gibt schnellere Sammlungen, die threadsicher sind, z. B. ConcurrentHashMap. Die zugrunde liegende Natur von CopyOnWriteArraySet gewährleistet threadsichere Vorgänge.