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