2017-11-27 5 views
1

私は皆知っているように、私は+ + Javaで原子ではないので、私はそれを証明するプログラムを作成しようとします。私が++であることを証明する方法

私の考えは、いくつかの新しいスレッドを追加し、各スレッド内でカウントを増やすことです(Mainクラスの静的フィールドです)。

threadNum * iteration > 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.

そして、私は上記のプログラムでは、iとjを変更する方法がない母校、i*j === count.

である私があれば知りませんこれは参考になります:このプログラムはJRE 6,7および8でテストされています。Java 5以前ではテストしていません。

+2

2つのループ。開始するには1つ、参加するには1つ。すべてのスレッドが順番に実行されます。 – Marvin

+4

本質的にシングルスレッドのときは、すべてのスレッドが起動するまで 't.join()'を呼び出さないでください。 –

答えて

5

joinメソッドは、現在実行中のスレッドを、呼び出されたスレッドの完了を待ちます。あなたのコードでは、スレッドを開始し、それが完了するのを待ってから別のスレッドを開始します。

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

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

変更

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

これは、実行中のすべてのスレッドを開始し、それらのすべてが完了するのを待ちます。

0

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

あなたの方法で一度に1つのスレッドが実行されている間、それは、マルチスレッドで実行されます。このようにして変更

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

+2

これは以前の答えと同じです... –

+0

彼が投稿している間、私は執筆中でした。 –

関連する問題