2016-06-11 10 views
0

次の問題は、OCP Java SE 7 Programmer II試験の模擬試験にあります。解決策は答えが0だと言いますが、私の同僚と私は答えが-5と5の間でないことを確信していません(これは選択肢です)。コードは次のとおりです。AtomicIntegerを使用したスレッドの動作

import java.util.concurrent.atomic.AtomicInteger; 
class AtomicVariableTest { 
     private static AtomicInteger counter = new AtomicInteger(0); 
     static class Decrementer extends Thread { 
       public void run() { 
         counter.decrementAndGet(); // #1 
       } 
     } 
     static class Incrementer extends Thread { 
       public void run() { 
         counter.incrementAndGet(); // #2 
       } 
     } 
     public static void main(String []args) { 
       for(int i = 0; i < 5; i++) { 
         new Incrementer().start(); 
         new Decrementer().start(); 
       } 
       System.out.println(counter); 
     } 
} 

ありがとうございます!

+3

それは間だ-5あなたが始めた10のスレッドのうち、カウンターを印刷する前に何人が実際に作業を行ったのか分かりません。なぜなら、それらが完了するのを待たずにいたからです。 –

+1

@SotiriosDelimanolis - 私はあなたが "未定義"を意味するとは思わない(ここではスレッドの安全でないアクションはない)。私はあなたが "非決定論的"を意味すると思う(@MattTimmermansのように)、どのスレッドが完了したか分からないからです。 – jtahlborn

+1

@jtahええ、あなたが言ったこと。 –

答えて

0

いくつかのログで複数回実行すると、スレッドの実行順序が結果を変えることがわかります。複数の実行では、私は0を得ましたが、私のマシン上では実験的に-1から2まで変化しました。このプログラムの出力は次のように見ている

class AtomicVariableTest 
{ 
    private static AtomicInteger counter = new AtomicInteger(0); 

    static class Decrementer extends Thread 
    { 
     public void run() 
     { 
      counter.decrementAndGet(); // #1 
      System.out.println("dec"); 
     } 
    } 

    static class Incrementer extends Thread 
    { 
     public void run() 
     { 
      counter.incrementAndGet(); // #2 
      System.out.println("inc"); 
     } 
    } 

    public static void main(String[] args) 
    { 
     for (int i = 0; i < 5; i++) 
     { 
      new Incrementer().start(); 
      new Decrementer().start(); 
     } 
     System.out.println(counter); 
    } 
} 

間-5と5:私はこれまで唯一の有効な答えがあると言うでしょう

inc 
dec 
inc 
dec 
inc 
dec 
inc 
dec 
0 
inc 
dec 

dec 
-1 
inc 
dec 
inc 
dec 
dec 
dec 
inc 
inc 
inc 
関連する問題