2017-11-27 7 views
1

우리 모두 알다시피, ++는 자바에서 원자가 아니기 때문에 그것을 증명하기위한 프로그램을 작성하려고합니다.증명하는 법 i ++은 원자가가 아니다

제 아이디어는 여러 개의 새로운 스레드와 각 스레드 내부에서 증가 카운트 (Main 클래스의 정적 필드)입니다.

threadNum * iteration > count, 

은 우리가 원자하지 ++ 내가 증명할 수 있지만, 실제로 나는 항상 동일한을 가지고있어. 내가 알고하지 않습니다, 나는 내가하고 위의 프로그램에서 J를 변경하는 방법 i*j === count.

import java.util.ArrayList; 
import java.util.List; 

public class ConcurrentTest{ 
    private static int count = 0; 

    public static void main(String[] args) throws Exception{ 
     List<Thread> threads = new ArrayList<>(); 
     for(int i = 0; i<12; ++i){ 
      threads.add(new Thread(() -> { 
       for(int j=0; j<1000000; ++j) { 
        count++; 
       } 
      })); 
     } 
     for(Thread t: threads){ 
      t.start(); 
      t.join(); 
     } 
     System.out.println(count); 
    } 
} 

결과는 12000000.

입니다 그리고 더 이잖아요 : 여기

내 코드입니다 유용한 정보 :이 프로그램은 JRE 6, 7 및 8에서 테스트되었습니다. Java 5 이전에서는 테스트하지 않았습니다.

+2

두 개의 루프. 시작하려면 하나, 가입하려면 하나. 모든 스레드가 순차적으로 실행됩니다. – Marvin

+4

본질적으로 싱글 스레드 인 순간에 모든 스레드가 시작될 때까지는't.join()'을 호출하지 마십시오. –

답변

5

join 메서드는 현재 실행중인 스레드를 호출 한 스레드의 완료를 기다립니다. 코드에서 스레드를 시작한 다음 스레드가 완료 될 때까지 기다린 다음 다른 스레드를 시작합니다.

이 모든 스레드가 실행을 시작하고, 그들 모두가 완료 될 때까지 기다립니다 것이다

for(Thread t: threads){ 
     t.start(); 
     t.join(); 
} 

for(Thread t: threads){ 
     t.start(); 
} 

for(Thread t: threads){ 
     t.join(); 
} 

로 변경합니다.

0

for(Thread t: threads){ 
      t.start(); 
     } 
for(Thread t: threads){ 
      t.join(); 
     } 

당신의 방식으로 한 번에 하나의 스레드가 실행되는 동안은, 멀티 스레드 실행이 방법으로 변경

for(Thread t: threads){ 
      t.start(); 
      t.join(); 
     } 

.

+2

이것은 이전 대답과 동일합니다 ... –

+0

그가 게시하는 동안 미안 해요. –