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) 同步化。
此類別的go方法使用迴圈產生5個執行緒,此5個執行緒的程式碼(第10~12行)呼叫foo方法,然後再印出x的值。
為了要讓輸出是1, 2, 3, 4, 5,,程式要避免執行對x的存取競爭,破壞掉x的遞增邏輯,此題的觀念是,所有對x的存取敘述要放在一個同步區塊內,也就是先將第12行對x的輸出放進foo方法中(答案A),再把foo方法內部敘述(對x的所有存取敘述)以synchronized(this) 同步化。
Comments