2016-06-11 6 views
0

Das folgende Problem tritt bei einer Scheinprüfung für die OCP Java SE 7 Programmer II-Prüfung auf. Die Lösung sagt, dass die Antwort 0 ist, aber meine Kollegen und ich sind nicht sicher, dass die Antwort nicht zwischen -5 und 5 liegt (was eine Wahl ist) Könnte jemand das für uns klären? Hier ist der Code:Behavoir of Threads mit 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); 
     } 
} 

Vielen Dank!

+3

Es ist zwischen -5 und 5. Von den 10 Threads, die Sie gestartet haben, wissen Sie nicht, wie viele tatsächlich gearbeitet haben, bevor Sie den Counter ausdrucken, weil Sie nicht darauf gewartet haben, dass sie fertig sind. –

+1

@StiriosDelimanolis - ich glaube nicht, dass du "undefined" meintest (es gibt hier keine unsicheren Aktionen). ich denke, du meintest "nicht deterministisch", da (wie @MattTimmermans) darauf hinweist, dass du nicht weißt, welche Threads vollständig sind. – jtahlborn

+1

@jtah Yeah, was du gesagt hast. –

Antwort

0

Die mehrfache Ausführung mit einigen Protokollen zeigt, dass die Reihenfolge, in der die Threads ausgeführt werden, das Ergebnis ändert. Bei mehreren Durchläufen erhielt ich 0, aber die Ergebnisse variierten experimentell von -1 bis 2 auf meinem Computer. Ich würde sagen, dass die einzige gültige Antwort auf diese Frage ist: Zwischen -5 und 5.

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); 
    } 
} 

Ausgabe dieses Programms wird wie folgt aussehen:

inc 
dec 
inc 
dec 
inc 
dec 
inc 
dec 
0 
inc 
dec 

dec 
-1 
inc 
dec 
inc 
dec 
dec 
dec 
inc 
inc 
inc