2016-06-11 6 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 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