2016-06-07 3 views
1

멀티 스레딩 및 싱글 스레딩으로 100 개의 숫자를 계산하려고합니다. synchronized 키워드는 한 번에 하나의 스레드 만 허용하기 때문에 (단일 스레드와 비슷합니다), 스레드 생성 및 동기화에 따른 시간 낭비를 무시하면 아래의 두 메서드는 동일한 런타임을 가져야합니다.동기화 된 멀티 스레딩 대 싱글 스레드

멀티 스레딩 동기화 사용 :

public synchronized static void increment() { 
    sum++; 
} 

public static void main(String[] args) { 
    Thread t1 = new Thread(new Runnable() { 
     @Override 
     public void run() { 
      for (int i = 0; i < 50; i++) { 
       increment(); 
      } 
     } 
    }); 
    Thread t2 = new Thread(new Runnable() { 
     @Override 
     public void run() { 
      for (int i = 0; i < 50; i++) { 
       increment(); 
      } 
     } 
    }); 
    t1.start();; 
    t2.start(); 
    try { 
     t1.join(); 
     t2.join(); 
    } catch (InterruptedException e) { 
     e.printStackTrace(); 
    } 
    System.out.println(sum); 

단일 스레딩 :

public static void main(String[] args) { 
    for (int i = 0; i < 100; i++) { 
     sum++ 
    } 

    System.out.println(sum); 
} 
+0

두 번째 접근 방식에서 't1'이란 무엇입니까? 't3'을 의미합니까? –

+0

예. 나는 그것을 편집했다. @AndyTurner – SHE

+0

"synchronized를 사용한 싱글 스레딩 :"실제로는 멀티 스레드입니다. 메인 스레드와't3'을 가지고 있습니다. 그리고 당신은'동기화'를 사용하지 않습니다. –

답변

1

자바 멀티 스레딩에서 정말 좋은,하지만 스레드를 생성하고 동기화 오버 헤드 많은 돈 때문에,이 100으로 계산하는 것과 같은 간단한 문제의 경우 실제로 런타임이 증가하는 것을 보게되면 놀라지 않을 것입니다.

+0

스레드 생성 및 동기화에 많은 시간이 소요되는 것을 무시하면 실행 시간은 대략 같아야합니까? @Scott Twombly – SHE

+0

물론,하지만 그게 현명하지 않다고 생각합니다. Java에서 jvm을 분리 할 수 ​​없습니다. 숫자가 증가하는 횟수를 계산하려면 물론 두 시나리오에서 동일하지만 거의 의미가 없습니다. 더 많은 "일들"이 일어나고 메소드가 멀티 쓰레드 예제에서 호출되고 있습니다. 무시하면, 처음부터이 것들을 비교할 점이 무엇인지 궁금합니다. @SHE –

+0

@SHE, 당신은 토마스 클레거 (Thomas Kläger)의 요점을 놓치고 있습니다 (위의 질문에 대한 그의 주석 참조). 좋은 컴파일러는 단일 스레드 예제에 의해 계산 된'sum'이 어떤 함수 호출이나 어떤 입력에 대해서도 변수에 의존하지 않는다는 것을 인식 할 수 있습니다. 그것은 단지 상수입니다. 그것은 4950이고, 항상 4950이 될 것입니다. 좋은 컴파일러는 전체 루프를'sum = 4950; '으로 대체 할 수 있습니다. 그러면 프로그램의 출력은 변경되지 않지만 훨씬 빠릅니다. 그러나 멀티 스레드 버전에서는 컴파일러가이를 수행 할 수 없습니다. 너무 복잡합니다. –