Есть ли замена для Java Stack, который не синхронизирован? - PullRequest
8 голосов
/ 16 февраля 2011

У меня есть большая кодовая база (написанная мной), которая использует структуру данных стека.Это было использовано для удобства, и я иногда использую его как Stack или Vector / List.

Однако после анализа производительности было решено, что мы не хотим доплачивать за безопасность синхронизации.Теперь мне нужно заменить эту структуру несинхронизированной (и это часто упоминается в коде).

Я был рад обнаружить, что коллекции Apache включают ArrayStack что именно то, что я хочу (так же, как стек Java, но не синхронизирован).Однако это НЕ имеет обобщений как современный код Java 5 (что я и использую).И я не собираюсь преобразовывать свой код в Java 1.4

Так есть ли какая-либо другая совместимая с Java 5 замена для Java Stack или мне нужно написать свой собственный?

Обновление:

Я использовал LinkedList с настроенными методами "pop" / "push".

Ответы [ 2 ]

8 голосов
/ 16 февраля 2011

Когда вы говорите «Java 5-совместимый» - ArrayDeque<T> не прибыл до Java 6, но звучит как то, что вам нужно (конечно, используя соответствующий интерфейс Deque<T>),Вы можете использовать его как стек, когда хотите, или как очередь, где это более уместно ... просто вызовите соответствующие методы, в основном.

1 голос
/ 16 февраля 2011

В вашем особом случае (и фактически только в таком случае) я просто скопировал бы и вставил класс Stack из реализации Java SE с открытым исходным кодом в ваш собственный пакет и удалил все синхронизированные ключевые слова , Вы можете добавить extends java.util.Stack. Теперь вам нужно всего лишь изменить декларации импорта в вашем коде.

Я понимаю, что обычно не очень хорошая идея копировать код, но вот почему это не относится к этому случаю:

  • Если семантика стека pop() и push() хорошо подходит для текущего кода, то это не изменится только из-за соображений производительности. Семантика deque или связанного списка различна (они позволяют добавлять / удалять с обеих сторон).
  • Издержки синхронизации java.util.Stack не могут быть удалены другим методом, таким как создание подклассов (вызов методов super) или делегирование.
  • Лучше скопировать хорошо протестированный код (насколько позволяет лицензия), чем переписать с нуля.

В целом, было бы намного лучше использовать java.util.Stack, как если бы это был интерфейс, и не использовать new Stack() в коде, а создавать его с помощью фабрик.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...