Thursday, April 5, 2007

Anyone can help this Question?

10. public class Transfers {

11. public static void main(String[] args) throws Exception {

12. Record r1 = new Record();

13. Record r2 = new Record();

14. doTransfer(r1, r2, 5);

15. doTransfer(r2, r1, 2);

16. doTransfer(r1, r2, 1);

17. // print the result

18. System.out.println(”rl = “ + r1.get() +“, r2=” + r2.get());

19. }

20. private static void doTransfer(

21. final Record a, final Record b, final int amount) {

22. Thread t = new Thread() {

23. public void run() {

24. new Clerk().transfer(a, b, amount);

25. }

26. };

27. t.start();

28. }

29. }

30. class Clerk {

31. public synchronized void transfer(Record a, Record b, int amount){

32. synchronized (a) {

33. synchronized (b) {

34. a.add(-amount);

35. b.add(amount);

36. }

37. }

38. }

39. }

40. class Record {

41.int num=10;

42. public int get() { return num; }

43. public void add(int n) { num = num + n; }

44. }

If Transfers.main() is run, which three are true? (Choose three.)

A. The output may be “r1 = 6, r2 = 14”.

B. The output may be “r1 = 5, r2 = 15”.

C. The output may be “r1 = 8, r2 = 12”.

D. The code may run (and complete) with no output.

E. The code may deadlock (without completing) with no output.

F. M IllegalStateException or InterruptedException may be thrown at

runtime.

Answer is....

ABE.

I got no ideas about these answer. I guess the answer is r1 = 10, r2 = 10 which same as I run it in Java Program. I don't understand why is ABE. anyone can help?

Monday, April 2, 2007