2010年8月31日 星期二

Java 執行緒 - wait¬ify

繼上一篇,繼續說明 synchronized 的用法

首先,我們必須分為實體方法與類別方法

實體方法簡單說就是 non-static method,而類別方法就是 static method

其中實體方法可以寫成兩種表示式

1. synchronized void method(){..........}


2. void method(){
           synchronized (this){  //鎖定的是 this, 代表的是這個物件
                 ............
           }
    }

對照上一篇所說的觀念,說穿了 synchronized 保護的就是一個物件(實體)的所有實體方法。

而類別方法也有兩種寫法

1. static synchronized void method(){............}


2. static void method(){
         //假設此類別名稱為 Test, 所以保護的當然是類別 Test
         synchronized(Test.class){  
                ...................
         }
    }


接下來要介紹 wait() 和 notify(),先來說明一些重點


1. wait() 和 notify(),必需置放在 synchronized 區塊中
2.這兩個方法都是 Object 的類別方法,如下
 someObj.wait()  或是  this.wait()  等於  wait()


wait() 顧名思義就是等待,也就是說當執行續執行到


wait() 的敘述時,該執行緒即會進入等待的狀態,至於去哪裡等待


這並不重要,可以想像成有一個地方存放著所以在 wait 的執行緒


下面以圖示說明會比較清楚










上述圖示,簡單描述就是說,當執行緒A 取得物件鎖進入執行

synchronized method 時,如果遇到 wait() 則會釋放物件鎖並進入等待區

這時在外面的執行緒B 取得物件鎖並進入執行 synchronized method

執行時遇到 notify() 則會把 A 叫醒,此時A離開等待區間

並開始競爭物件鎖,但B必須把 notify() 之後的程式執行完

才會釋放物件鎖,釋放物件鎖後,A取得物件鎖並進入執行

此時執行的起始位置是在 wait() 之後。


下一篇會實做一提範例供參考

沒有留言:

張貼留言