4-4.(4) Thread 동기화 Collection

zhyun·2020년 9월 25일
0

HighJava

목록 보기
35/67
post-custom-banner

Collection 활용한 Thread 동기화

  • Vector,Hashtable등 예전부터 존재하던 Collection 클래스들은
    내부에 동기화처리가 되어 있다.
  • 그런데, 최근 새로 구성된 Collection들은 동기화 처리가 되어있지 않다.
  • 그래서 Collection들을 사용하려면 동기화 처리를 한 후에 사용

T18_SyncCollectionTest

public class T18_SyncCollectionTest {

private static List<Integer> list1 = new ArrayList<Integer>();
	
	//동기화하는경우
	//Collections의 정적메서드 주에서 synchronized로 시작하는 메서드 이용.
	private static List<Integer> list2 = Collections.synchronizedList(new ArrayList<>());
	
	public static void main(String[] args) {
		//익명 클래스로 쓰레드 구현
		Runnable r = new Runnable() {
			
				public void run() {
				for(int i =1; i<=10000; i++) {
					//list1.add(i);//동기화 처리를 하지 않은 리스트 사용
					list2.add(i);
				}
			}
		};
	
		Thread[] ths = new Thread[] {
				new Thread(r),new Thread(r),
				new Thread(r),new Thread(r),new Thread(r)
		};
		
		long startTime = System.currentTimeMillis();
		
		for(Thread th : ths) {
			th.start();
		}
		
		for(Thread th : ths) {
			try {
				th.join();
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
		
		long endTime = System.currentTimeMillis();
		
		System.out.println("처리 시간(ms)"+(endTime-startTime));
//		System.out.println("list1의 개수 : "+list1.size());
		System.out.println("list2의 개수 : "+ list2.size());
	}
}

1. 동기화를 처리하지 않을 경우

private static List<Integer> list1 = new ArrayList<Integer>();
  • Cosole : lis1의 개수가 50000으로 딱 맞게 출력되지 않는다.

2. 동기화 하는 경우

  • 새로 구성된 Collection이므로 synchronizedList로 동기화 처리
    Collections.synchronizedList(new ArrayList<>());
private static List<Integer> list2 = Collections.synchronizedList(new ArrayList<>());
  • Console:
profile
HI :)
post-custom-banner

0개의 댓글