總網頁瀏覽量

2016年3月23日 星期三

[Java] SCJP 例題 221

Given:
7.   void waitForSignal(){
8.           Object obj = new Object();
9.            synchronized(Thread.currentThread()){
10.                   obj.wait();
11.                   obj.notify();
12.          }
13.  }

Which statement is true? [1]
  A. This code can throw an InterruptedException.
  B. This code can throw an IllegalMonitorStateException.
  C. This code can throw a TimeoutException after ten minutes.
  D. Reversing the order of obj.wait() and obj.notify() might cause
      this method to complete normally.
  E. A call to notify() or notifyAll() from another thread might cause
      this method to complete normally.
  F. This code does NOT compile unless "obj.wait()" is replaced with "((Thread) obj).wait()".


 網站解析

  IllegalMonitorStateException是說一個執行緒試圖在未取得物件lock時,
去對該物件進行等待(wait)或通知(notify)的動作,會產生的一個不合法的監控狀態例外。

         正確的程式寫法應如下:
                   synchronized(obj) {
                     }
         取行obj的lock後,方能對obj進行wait或notify。


[1] 192.192.246.169/~wells/wiki/index.php/SCJP_1.6版考題_221

對於這種選項多又沒講要答幾個的題目真的很難判斷,
這題我選AD。
因為我以為wait()沒在try-catch()理面的問題比較大,
原來包在他外面的 synchronized()更大,又一次失物。

同步synchronized()有三種,沒記錯的話一種式放置在方法宣告中,
另外兩種式synchronized(o)和synchronized(class)。

沒有留言:

張貼留言