동기화 처리가 되어있는 Vector
예전부터 존재하던 Collection 객체들은 내부에 동기화 처리가 되어있다. : Vector, Hashtable
그런데 새롭게 구성된 Collection 객체들은 그렇지 않아서 동기화가 필요한 프로그램에서는 처리를 한 후에 사용해야한다.
Vector를 사용하여 동기화 확인하기
// 익명 구현체로 쓰레드 구현
Runnable r = new Runnable() {
@Override
public void run() {
for(int i=1; i<=10000; i++) {
vec.add(i);
}
}
};
//----------------------------------
익명 구현체 쓰기 연습해야겠다...
Thread[] tharr = new Thread[] {
new Thread(r), new Thread(r), new Thread(r),
new Thread(r), new Thread(r)
};
for(Thread th : tharr) {
th.start();
}
for(Thread th : tharr) {
try {
th.join();
} catch (InterruptedException e) {
// TODO: handle exception
}
}
System.out.println("vec의 개수 : " + vec.size());
5개의 쓰레드가 10000번까지 더하니까 결과가 50000만 나오면 성공이다.
----- 결 과 -----
vec의 개수 : 50000
그럼 새로 만들어진 List를 사용해본다면?
private static Vector<Integer> vec = new Vector<Integer>();
벡터 만든 자리 아래에 바로 리스트를 만들고,
vec.add(i); -> list1.add(i);
로 바꾸고,
System.out.println("list1의 개수 : " + list1.size()); 로 결과를 출력하면?
동기화가 되어있지 않아서
----- 결 과 -----
오류 + list1의 개수 : 11028
--------------------
이렇게 나온다.
동기화의 중요성...
5만개가 10000개로 줄어드는 마법....!!
그럼 List는 동기화를 못할까? 방법이 있다!!
// 동기화 처리를 한 List2
private static List<Integer> list2 =
Collections.synchronizedList(new ArrayList<Integer>());
Collections 에 있는 synchronizedList를 이용하여 동기화를 처리하고
아까처럼 list2.add하고 출력문도 수정하여 출력해보자.
결과는 ?
----- 결 과 -----
list2의 개수 : 50000
--------------------
또다시..