내가 보려고 정리하는/JAVA

동기화 처리가 되어있는 Vector

보동이용용 2022. 12. 28. 10:22
반응형

예전부터 존재하던 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

--------------------

 

또다시..

동기화의 중요성...!

반응형