동기화된 컬렉션
컬렉션 프레임워크의 대부분의 클래스들은 싱글 스레드 환경에서 사용할 수 있도록 설계되었다. 그렇기 때문에 여러 스레드가 동시에 컬렉션에 접근한다면 의도하지 않게 요소가 변경될 수 있는 불안전한 상태가 된다.
Vector와 Hashtable은 동기화된 메서드로 구성되어 있기 때문에 멀티 스레드 환경에서 안전하게 요소를 처리할 수 있지만, ArrayList와 HashSet, HashMap은 동기화된 메서드로 구성되어 있지 않아 멀티 스레드 환경에서 안전하지 않다.
경우에 따라서는 ArrayList, HashSet, HashMap을 멀티 스레드 환경에서 사용하고 싶을 것이다. 이런 경우를 대비해서 컬렉션 프레임워크는 비동기화된 메서드를 동기화된 메서드로 래핑 하는 Collections의 synchronizedXXX() 메서드를 제공한다.
| 리턴 타입 | 메서드(매개변수) | 설명 |
| List<T> | synchronizedList(List<T> list) | List를 동기화된 List로 리턴 |
| Map<K, V> | synchronizedMap(Map<K, V> m) | Map을 동기화된 Map으로 리턴 |
| Set<T> | synchronizedSet(Set<T> s) | Set을 동기화된 Set으로 리턴 |
이 메서드들은 매개값으로 비동기화된 컬렉션을 대입하면 동기화된 컬렉션을 리턴한다.
다음 코드는 ArrayList를 Collections.synchronizedList() 메서드를 사용해서 동기화된 List로 변환한다.
List<T> list = Collections.synchronizedList(new ArrayList<T>());
다음 코드는 HashSet을 Collections.synchronizedSet() 메서드를 사용해서 동기화된 Set으로 변환한다.
Set<E> set = Collections.synchronizedSet(new HashSet<E>());
다음 코드는 HashMap을 Collections.synchronizedMap() 메서드를 사용해서 동기화된 Map으로 변환한다.
Map<K, V> map = Collections.synchronizedMap(new HashMap<K, V>());
예제 코드
package ch15;
import java.util.*;
public class SynchronizedMapExample {
public static void main(String[] args) {
// TODO Auto-generated method stub
Map<Integer, String> map =Collections.synchronizedMap(new HashMap<>());
Thread threadA = new Thread() {
@Override
public void run() {
for(int i=1; i<=1000; i++) {
map.put(i, "내용" + i);
}
}
};
Thread threadB = new Thread() {
@Override
public void run() {
for(int i=1001; i<=2000; i++) {
map.put(i, "내용" + i);
}
}
};
threadA.start();
threadB.start();
try {
threadA.join();
threadB.join();
} catch(Exception e) {
}
int size = map.size();
System.out.println("총 객체 수: " + size);
}
}
출력 결과
총 객체 수: 2000
'Language > JAVA' 카테고리의 다른 글
| [JAVA] 람다식 (0) | 2024.10.21 |
|---|---|
| [JAVA] 수정할 수 없는 컬렉션 (1) | 2024.10.18 |
| [JAVA] LIFO와 FIFO 컬렉션 (1) | 2024.10.18 |
| [JAVA] 검색 기능을 강화시킨 컬렉션 (0) | 2024.10.18 |
| [JAVA] Map 컬렉션 (0) | 2024.10.18 |