2016-10-03 19 views
-1

整数整数を使用してカウンタを実装しようとしていますが、すべてのスレッドがタスクを完了した後に最終値を出力しようとしていますが、 20である必要がありますが、次のようにプログラムがあるなど17,18,16,19,20のようアトミック整数インクリメントプログラムが期待どおりに動作しない

が変動している:

class AtomicOperations implements Runnable 
{ 
private AtomicInteger ai; 
private int a; 

AtomicOperations(int aivalue, int ivalue) { 
    ai = new AtomicInteger(aivalue); 
    this.a = ivalue; 
} 

@Override 
public void run() { 
    ai.getAndIncrement(); 
} 

    public static void main(String args[]) { 
    AtomicOperations obj = new AtomicOperations(10, 10); 
    Thread[] t = new Thread[10]; 
    synchronized (obj) { 
     for (int i = 0; i < t.length; i++) { 
      t[i] = new Thread(obj, "Thread-" + (i + 1)); 
      t[i].start(); 
     } 
    } 
    System.out.println(obj.ai); 
    } 
} 
+1

あなたの 'synchronized(obj)'は何が良いのですか? – Kayaman

+0

原子は同期を必要としません。 –

+0

@Kayaman .. printステートメントが実行される前にこれがすべてのスレッドを完了すると思った – Amol

答えて

0

あなたは、スレッドが終了するまで待機し、その数されていません印刷時に完了したインクリメントの数は変わる可能性があります。

+0

私は同期ブロックを追加しました。私はそれを私のdoと考えました – Amol

+1

あなたが理解していないことを周りに振りかけると、決して同期が得られません。ここで必要なのは、スレッドが終了したときを知るための方法です。 'synchronized'ブロックは何かが終了するのを待たず、途中で中断しません。 (多かれ少なかれ)共有されているものは何も保護しないので、ここでは何もしません。 –

+0

point taken ...メインの実行はsyncブロックを上回ります。だから私はjoin()を使う必要がありますか? – Amol

関連する問題