Java/자바 정리

138. Vector로 멀티스레드 환경에서도 안전하게 저장하기

코딩하는냥이 2025. 5. 20. 11:19
반응형

멀티스레드 환경에서 ArrayList와 같은 컬렉션을 사용할 경우,
여러 스레드가 동시에 접근하면 데이터 충돌이나 예외가 발생할 수 있습니다.
이럴 때는 동기화(Synchronized)가 적용된 Vector 컬렉션을 사용하면 안전하게 처리할 수 있습니다.
이번 예제는 두 개의 스레드가 동시에 데이터를 저장할 때 Vector가 어떻게 안정성을 보장하는지 보여줍니다.


📦 Board.java

package ch15.sec02;

public class Board {
	private String subject, content, writer;
	
	public Board(String subject, String content, String writer) {
		setSubject(subject);
		setContent(content);
		setWriter(writer);
	}

	public String getSubject() {
		return subject;
	}

	public void setSubject(String subject) {
		this.subject = subject;
	}

	public String getWriter() {
		return writer;
	}

	public void setWriter(String writer) {
		this.writer = writer;
	}

	public String getContent() {
		return content;
	}

	public void setContent(String content) {
		this.content = content;
	}
}

📌 예제 코드

package ch15.sec02;

import java.util.List;
import java.util.Vector;

public class VectorExample {
	public static void main(String[] args) {
		List<Board> list = new Vector<Board>();
		
		Thread threadA = new Thread() {
			public void run() {
				for(int i = 1; i <= 1000; i++)
					list.add(new Board("제목" + i, "내용" + i, "글쓴이" + i));
			}
		};
		
		Thread threadB = new Thread() {
			public void run() {
				for(int i = 1001; i <= 2000; i++)
					list.add(new Board("제목" + i, "내용" + i, "글쓴이" + i));
			}
		};
		
		threadA.start();
		threadB.start();
		
		try {
			threadA.join();
			threadB.join();
		} catch (Exception e) {
			// 예외 처리 생략
		}
		
		System.out.println("총 객체 수 : " + list.size());
	}
}

💻 실행 결과

총 객체 수 : 2000

※ Vector 덕분에 두 스레드가 동시에 데이터를 추가하더라도 데이터 손실 없이 정확하게 2000개가 저장됩니다.


💬 코드 설명

  • Board 클래스는 제목, 내용, 작성자를 저장하는 게시글 객체입니다.
  • Vector는 List 인터페이스를 구현한 컬렉션으로, 내부에 **자동 동기화 처리(synchronized)**가 적용되어 있습니다.
  • 두 개의 스레드가 각각 1000개의 게시글을 동시에 list에 저장합니다.
  • join() 메서드를 통해 두 스레드가 작업을 모두 마칠 때까지 메인 스레드는 대기합니다.
  • 모든 작업이 완료된 후 list.size()를 출력하면, 객체 수가 정확히 2000개인 것을 확인할 수 있습니다.

💡 포인트 정리

  • Vector는 멀티스레드 환경에서 안전하게 데이터를 처리할 수 있도록 자동으로 동기화가 적용된 리스트입니다.
  • ArrayList는 동기화 처리가 없기 때문에 동시 접근 시 예외나 데이터 손실이 발생할 수 있습니다.
  • 멀티스레드 환경에서는 Vector 또는 Collections.synchronizedList()를 사용하는 것이 좋습니다.
  • join()을 활용하면 스레드가 모두 작업을 끝낸 뒤 다음 로직을 실행할 수 있습니다.

📌정리하자면, 멀티스레드 상황에서 하나의 리스트에 데이터를 동시에 추가할 경우,
동기화가 되지 않으면 정상적으로 저장되지 않거나 충돌이 발생할 수 있습니다.
이러한 상황에서는 Vector처럼 동기화를 기본으로 지원하는 컬렉션을 사용함으로써 안정성을 확보할 수 있습니다.
이번 예제는 Vector를 활용하여 2000개의 객체가 정확하게 저장되는 결과를 보여줌으로써,
멀티스레드 환경에서의 안전한 컬렉션 사용법을 이해할 수 있는 좋은 사례가 됩니다.