Gibt es einen Ersatz für Java Stack, der nicht synchronisiert ist?

8

Ich habe eine große Codebase (von mir geschrieben), die die Stack-Datenstruktur verwendet. Dies wurde aus Gründen der Bequemlichkeit verwendet und ich benutze es manchmal als Stack oder manchmal als Vector / List.

Nach einer Leistungsüberprüfung wurde jedoch entschieden, dass wir für die Synchronisierungssicherheit nicht extra bezahlen wollen. Ich muss jetzt diese Struktur durch eine nicht-synchronisierte ersetzen (und es wird oft im Code erwähnt).

Ich war froh zu entdecken, dass Apache-Sammlungen einen ArrayStack enthalten was genau das ist, was ich möchte (genauso wie Java Stack, aber nicht synchronisiert). Allerdings hat dies keine Generika als modernen Java 5 Code (was ich verwende). Und ich werde meinen Code nicht so konvertieren, dass er wie Java 1.4 aussieht.

Gibt es also einen anderen Java 5-konformen Drop-in-Ersatz für Java Stack oder muss ich meinen eigenen schreiben?

Aktualisierung:

Ich habe LinkedList mit abgestimmten "pop" / "push" Methoden verwendet.

    
kazanaki 16.02.2011, 09:46
quelle

2 Antworten

8

Wenn Sie "Java 5-kompatibel" sagen - ArrayDeque<T> kam erst in Java 6 an, klingt aber nach dem, wonach Sie suchen (natürlich mit der Schnittstelle Deque<T> ). Sie können es als einen Stapel verwenden, wenn Sie möchten, oder eine Warteschlange, wo das passender ist ... rufen Sie einfach die entsprechenden Methoden im Grunde.

    
Jon Skeet 16.02.2011, 09:50
quelle
1

In Ihrem speziellen Fall (und eigentlich nur in einem solchen Fall) kopiere und füge ich einfach die Stack-Klasse aus einer Open-Source-Java-SE-Implementierung in dein eigenes Paket ein und entferne alle synchronisierten Schlüsselwörter. Vielleicht möchtest du extends java.util.Stack hinzufügen. Jetzt müssen Sie nur die Import-Deklarationen in Ihrem Code ändern.

Mir ist klar, dass normalerweise es keine gute Idee ist, Code zu kopieren, aber das ist der Grund, warum das nicht auf diesen Fall zutrifft:

  • Wenn die Semantik von pop() und push() eines Stacks für den aktuellen Code gut passt, ändert sich dies nicht nur aufgrund von Leistungsüberlegungen. Die Semantik einer Deque- oder Linked-List ist unterschiedlich (sie erlauben das Hinzufügen / Entfernen von beiden Seiten).
  • Der Synchronisationsoverhead von java.util.Stack kann nicht durch eine andere Technik wie Unterklassen (Aufruf von super Methoden) oder Delegierung.
  • entfernt werden
  • Es ist besser, gut getesteten Code zu kopieren (so weit es die Lizenz erlaubt), als von Grund auf neu zu schreiben.

Im Allgemeinen wäre es viel besser, java.util.Stack so zu verwenden, als wäre es eine Schnittstelle, und nicht new Stack() im Code zu verwenden, sondern mithilfe von Factories zu instanziieren.

    
Chris Lercher 16.02.2011 10:30
quelle

Tags und Links