Vector
синхронизируется на каждой отдельной операции. Это почти никогда не то, что вы хотите сделать.
Как правило, вы хотите синхронизировать всю последовательность операций. Синхронизация отдельных операций и менее безопасна (например, если вы выполняете итерацию по a Vector
, вам все равно нужно снять блокировку, чтобы никто не изменил коллекцию в одно и то же время, что могло бы вызвать a ConcurrentModificationException
в итерирующем потоке), но также и медленнее ( зачем вынимать блокировку повторно, когда одного раза будет достаточно)?
Конечно, он также имеет накладные расходы на блокировку, даже когда вам это не нужно.
По сути, это очень некорректный подход к синхронизации в большинстве ситуаций. Как отметил г-н Брайан Хенк , вы можете декорировать коллекцию, используя такие вызовы, как Collections.synchronizedList
- тот факт, что Vector
комбинация реализации коллекции «массив с измененным размером» и бита «синхронизировать каждую операцию» является еще одним примером плохого дизайна; декоративный подход дает более четкое разделение проблем.
Что касается Stack
эквивалента - я бы посмотрел на Deque
/ ArrayDeque
для начала.