2012년 10월 8일 월요일

OCJP 문제풀이 - Question 5


QUESTION 5
Given:

class PingPong2 {
  synchronized void hit(long n) {
    for(int i = 1; i < 3; i++)
      System.out.print(n + "-" + i + " ");
  }
}

public class Tester implements Runnable {
  static PingPong2 pp2 = new PingPong2();
  public static void main(String[] args) {
    new Thread(new Tester()).start();
    new Thread(new Tester()).start();
  }
  public void run() { pp2.hit(Thread.currentThread().getId()); }
}

Which statement is true?

A. The output could be 5-1 6-1 6-2 5-2
B. The output could be 6-1 6-2 5-1 5-2
C. The output could be 6-1 5-2 6-2 5-1
D. The output could be 6-1 6-2 5-1 7-1

Answer: B
Section: All

Explanation/Reference:

1> 메인함수의 11,12 라인에 의해 두개의 Thread가 차례로 생기고 실행된다.

2> 각각의 쓰레드 run() 함수를 호출하여 PingPong2 클래스의 hit() 함수를 실행한다. 이때 파라미터로 현재 쓰레드의 Id 값을 얻어내어 보내준다.

  두 쓰레드는 어떤것이 먼저 실행될지도 모르지만, hit() 함수는 synchronized 가 걸려있기때문에 한 쓰레드가 hit 함수를 실행하면 반드시 for문이 끝날때까지 실행된다. 즉, 두개의 Thread가 번갈아가며 실행되는 경우는 없다는 것이다.

  이 원리에 의하면 A,C 는 id가 5인 쓰레드와 6인 쓰레드가 번갈아가면서 실행하고 있기때문에 불가능하고, 한 쓰레드의 id값이 변경되는 경우는 없기때문에 Thread id 가 3개나 나타만 D도 불가능하다.

반면에, B는 id가 6인 쓰레드가 실행을 완료하고 id가 5인 쓰레드가 실행을 했기때문에 충분히 가능한 결과이다.

블로그 보관함