Strong Root

결론

* ArrayList 가 항상 옳다





Why

* ArrayList 에 대한 Vector 의 이점을 그나마 꼽자면, 멀티 쓰레드 환경에서의 동기화(synchronization) 를 꼽을 수 있다. Vector 의 소스코드를 살펴보면, 모든 동작(함수)에 대해 일일이 synchronized 가 붙어있다. 이것은 2가지 불행한 결과를 낳게 된다.



1. 프로그래머가 생각한 동기화가 이루어지지 않는다.


일반적으로 동기화는 개별 동작이 아닌 일련의 시퀀스에 대해서 이루어져야 한다. 하지만 Vector 는 단순히 개별 동작에 대한 lock 만 걸려있으므로, 대부분의 경우 Vector 를 사용하더라도 어차피 별도의 lock 이 필요하게 된다.


예를들어, 위 코드의 경우 빨간상자 안의 코드만 lock 이 걸릴 뿐 전체적인 시퀀스에는 걸려있지 않다. 따라서 멀티쓰레드 환경이라면 코드 실행 도중에 얼마든지 다른 thread 에 의해서 vector 가 변경될 수 있고 그로 인해 심각한 문제가 발생할 수 있다.




2. 불필요하게 느려진다.


위에서 언급한 것처럼 일련의 시퀀스에 대해 lock을 한다면 한번만 하면 되지만, vector 를 사용할 경우 불필요한 lock 과 unlock 이 반복된다.

또한 lock 을 원하지 않을 때에도 lock 에 의한 오버헤드가 발생하게 되는 이슈도 있다.






출처

1. GrepCode

 * http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/6-b27/java/util/ArrayList.java

 * http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/6-b14/java/util/Vector.java

2. StackOverflow

 * http://stackoverflow.com/questions/1386275/why-is-java-vector-class-considered-obsolete-or-deprecated