Вам действительно нужно классифицировать Java Vector по типу потоковой безопасности. Javas Vector безопасно использовать из нескольких потоков, потому что он использует синхронизацию методов. Состояние не будет испорчено.
Однако полезность вектора Java ограничена несколькими потоками без дополнительной синхронизации. Например, рассмотрим простой акт чтения элемента из вектора.
Vector vector = getVector();
if ( vector.size() > 0 ) {
object first = vector.get(0);
}
Этот метод не повредит состояние вектора, но он также неверен. Ничто не мешает другому потоку изменить вектор между оператором if и вызовом get (). Этот код может и будет в конечном итоге завершиться ошибкой из-за состояния гонки.
Этот тип синхронизации полезен только в небольшом количестве сценариев и, конечно, стоит недешево. Вы платите заметную цену за синхронизацию, даже если вы не используете несколько потоков.
.Net предпочла не платить эту цену по умолчанию из-за сценария, имеющего лишь ограниченную полезность. Вместо этого он решил реализовать список без блокировок. Авторы несут ответственность за добавление любой синхронизации. Это ближе к модели C ++: «платите только за то, что используете».
Недавно я написал пару статей об опасностях использования коллекций только с внутренней синхронизацией, таких как вектор Java.
Справочник по безопасности потоков вектора: http://www.ibm.com/developerworks/java/library/j-jtp09263.html
person
JaredPar
schedule
01.04.2009
ArrayList
предоставляет оболочку Synchronized. - person Mark Hurd   schedule 10.05.2012