ArrayList vs Vector
| ArrayList | Vector | |
|---|---|---|
| 사용법 | 동일 | 동일 |
| 멀티스레드 안전 | 안전하지 않음 | 안전함 |
| 속도 | 빠름 | 동기화로 약간 느림 |
| 사용 상황 | 단일 스레드 | 멀티스레드 (소켓 서버 등) |
package server;
import java.util.Vector;
public class ChatRoomSimulator {
// 공유 자원
private static Vector<String> userList = new Vector<>();
public static void main(String[] args) throws InterruptedException {
// ArrayList와 상용법 동일
// Vector<String> list = new Vector<>();
//
// list.add("철수");
// list.add("영희");
// list.remove("영희");
// list.get(0);
// list.size();
// list.contains("영희");
//
// for(String name: list) {
// System.out.println(name);
// }
System.out.println("=== 채팅방 접속자 시뮬레이션 ===");
// 3명이 동시에 접속
// 람다 표현식 이다.
// Thread t1 = new Thread(() -> {});
Thread t1 = new Thread(new Runnable() {
@Override
public void run() {
userList.add("철수");
System.out.println("[접속] 철수 | 현재 " + userList.size() + "명");
}
});
Thread t2 = new Thread(new Runnable() {
@Override
public void run() {
userList.add("영희");
System.out.println("[접속] 영희 | 현재 " + userList.size() + "명");
}
});
Thread t3 = new Thread(new Runnable() {
@Override
public void run() {
userList.add("민준");
System.out.println("[접속] 민준 | 현재 " + userList.size() + "명");
}
});
t1.start();
t2.start();
t3.start();
t1.join();
t2.join();
t3.join();
System.out.println("최종 접속자 : " + userList);
// 영희 퇴장
userList.remove("영희");
System.out.println("영희 퇴장 후 : " + userList);
} // end of main
}
Vector는 ArrayList보다 멀티스레드 환경에서 좀 더 안전하게 사용할 수 있는 컬렉션이다.
그 이유는 Vector의 주요 메서드(add, remove, size 등)에 synchronized가 적용되어 있기 때문이다.
즉, 여러 스레드가 하나의 공유 객체에 동시에 접근하려고 할 때
한 번에 하나의 스레드만 작업할 수 있도록 하여 데이터 충돌 가능성을 줄여준다.
반면 ArrayList는 내부적으로 동기화가 되어 있지 않으므로,
여러 스레드가 동시에 접근하여 값을 추가하거나 삭제하면
데이터가 꼬이거나 예상하지 못한 결과가 발생할 수 있다.
따라서 여러 스레드가 하나의 리스트를 함께 사용하는 환경에서는
ArrayList보다 Vector가 기본적으로 더 안전하다.
다만 Vector도 실행 순서까지 보장하는 것은 아니며,
복합적인 작업에서는 추가적인 동기화가 필요할 수 있다.