4-4.(4)Thread同期収集


CollectionによるThread同期

  • Vector、Hashtableなど以前から存在していた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:lis 1の個数はちょうど50000に出力できません.
  • 2.同期時

  • は新しい構成の集合であり、同期処理は同期リストである
    Collections.synchronizedList(new ArrayList<>());
  • private static List<Integer> list2 = Collections.synchronizedList(new ArrayList<>());
  • Console: