Vector - 컬렉션 - 2

Kim taegwan·2026년 4월 1일

ArrayList vs Vector

ArrayListVector
사용법동일동일
멀티스레드 안전안전하지 않음안전함
속도빠름동기화로 약간 느림
사용 상황단일 스레드멀티스레드 (소켓 서버 등)
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도 실행 순서까지 보장하는 것은 아니며,
복합적인 작업에서는 추가적인 동기화가 필요할 수 있다.

0개의 댓글