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개의 객체가 정확하게 저장되는 결과를 보여줌으로써,
멀티스레드 환경에서의 안전한 컬렉션 사용법을 이해할 수 있는 좋은 사례가 됩니다.