Wenn Sie synchronisierte Mengen verwenden, müssen Sie verstehen, dass der Synchronisationsaufwand für den Zugriff auf jedes Element in der Menge anfällt. Die Collections.synchronizedSet()
umschließt nur Ihr Set mit einer Shell, die jede Methode zur Synchronisierung zwingt. Wahrscheinlich nicht, was du wirklich wolltest. A ConcurrentSkipListSet
bietet Ihnen eine bessere Leistung in einer Multithread-Umgebung, in der mehrere Threads in das Set schreiben.
Die ConcurrentSkipListSet
ermöglicht es Ihnen, die folgenden auszuführen:
Set newSet = s.clone();//preferably use generics
Es ist nicht ungewöhnlich zu verwenden, um einen Klon eines Satzes für Snapshot-Verarbeitung. Wenn Sie danach suchen, können Sie einen kleinen Code hinzufügen, um den Fall zu behandeln, in dem das Element bereits verarbeitet wurde. Der Overhead, der mit dem gelegentlichen Objekt einhergeht, das in mehr als einem Kopiersatz enthalten ist, ist normalerweise geringer als der konsistente Aufwand, Collections.concurrentSet()
zu verwenden.
EDIT: Ich habe gerade festgestellt, dass ConcurrentSkipListSet Cloneable ist und bietet eine threadsafe clone()
Methode. Ich habe meine Antwort geändert, weil ich wirklich glaube, dass dies die beste Option ist - anstatt die Skalierbarkeit und Leistung auf Collections.concurrentSet()
zu verlieren.
Was sind die Bedingungen der Kopie? Kann sich das Original während des Kopierens ändern? Was versuchst du mit dem Klon zu erreichen? (kann Ihnen vielleicht einen effizienteren Weg vorschlagen, Ihre Ziele zu erreichen, aber Sie brauchen die Antwort auf diese Fragen, um sicherzustellen, dass es für Sie richtig ist) –
@Berin Loritsch: Ja, das Original-Set kann sich während des Kopierens ändern. Ich versuche, einen Iterator von einem Set zu bekommen, das im Sinne von Daten und Synchronisation von der ursprünglichen Collection unabhängig sein sollte. – MRalwasser