SCJP題庫第229題

 
Given:
1. public class TestFive{
2.   private int x;
3.   public void foo(){
4.     int current = x;
5.     x = current + 1;
6.   }
7.   public void go(){
8.     for(int i=0; i<5; i++){
9.       new Thread(){
10.       public void run(){
11.          foo();
12.          System.out.print(x + ", ");
13.       }}.start();
14.    }}
Which two changes, taken together, would guarantee the output: 1, 2, 3, 4, 5, ? (Choose two.) 


A. move the line 12 print statement into the foo() method
B. change line 7 to public synchronized void go(){
C. change the variable declaration on line 2 to private volatile int x;
D. wrap the code inside the foo() method with a synchronized(this) block
E. wrap the for loop code inside the go() method with a synchronized block synchronized(this){//for loop code here}
Ans: AD

 解說:此題問那二個改變,一起發生,可以保證輸出是1, 2, 3, 4, 5,?


此類別的go方法使用迴圈產生5個執行緒,此5個執行緒的程式碼(第10~12行)呼叫foo方法,然後再印出x的值。


為了要讓輸出是1, 2, 3, 4, 5,,程式要避免執行對x的存取競爭,破壞掉x的遞增邏輯,此題的觀念是,所有對x的存取敘述要放在一個同步區塊內,也就是先將第12行對x的輸出放進foo方法中(答案A),再把foo方法內部敘述(對x的所有存取敘述)以synchronized(this) 同步化。

Comments

Popular posts from this blog

Android-使用webview在V3版的Google地圖GPS定位