彩虹天堂
          技術源于生活
          posts - 0,  comments - 2,  trackbacks - 0
          Lock 與 Condition
          對於初學者來說,執行緒的同步化 並非是個容易理解的議題,在synchronized中隱含著物件鎖定與釋放鎖定的觀念,程式中並沒有明顯的語意來告知這一點,而必須靠程式設計人員本身記憶物件的鎖定與釋放鎖定問題。

          在java.util.concurrent.locks套件中新增了Lock與Condition等類別,可以讓您明確的在程式中進行明確的鎖定與釋放鎖定。

          Lock是一個介面,其中規範了lock()、unclock()與newCondition()三種方法:
          • lock()
          用來取得物件的鎖定。
          • unlock()
          用來釋放物件的鎖定,通常由同一個Lock物件來呼叫lock()與unlock()。
          • newCondition()
          建立一個與Lock物件相關聯的Conditon物件。
          Condition是一個介面,作用是在執行緒之間進行溝通,就如其名稱所示,告知執行緒目前的狀況為何,是要等待?還是通知?其規範的幾個重要方法為:
          • await()
          告知目前的執行緒等待,直到被通知或中斷(interrupted)。
          • signal()
          通知目前等待中的一個執行緒,從上次的等待點繼續執行,類似物件的notify()方法
          • signalAll()
          通知目前等待中的所有執行緒參與鎖定競爭,而後從上次的等待點繼續執行,類似物件的notifyAll()方法。

          在這邊直接改寫wait ()、notify() 中的Clerk類別,不使用synchronized、wait()、notify(),而改用Lock與Condition,其中ReentrantLock為Lock介面的一個實作類別:

          • Clerk.java
          import java.util.concurrent.locks.*;

          public class Clerk {
          private Lock lock = new ReentrantLock();
          private Condition threadCond = lock.newCondition();

          // -1 表示目前沒有產品
          private int product = -1;

          // 這個方法由生產者呼叫
          public void setProduct(int product) {
          lock.lock();
          try {
          if(this.product != -1) {
          try {
          // 目前店員沒有空間收產品,請稍候!
          threadCond.await();
          }
          catch(InterruptedException e) {
          e.printStackTrace();
          }
          }

          this.product = product;
          System.out.printf("生產者設定 (%d)%n", this.product);

          // 通知等待區中的一個消費者可以繼續工作了
          threadCond.signal();
          }
          finally {
          lock.unlock();
          }
          }

          // 這個方法由消費者呼叫
          public int getProduct() {
          lock.lock();
          int p = 0;
          try {
          if(this.product == -1) {
          try {
          // 缺貨了,請稍候!
          threadCond.await();
          }
          catch(InterruptedException e) {
          e.printStackTrace();
          }
          }

          p = this.product;
          System.out.printf(
          "消費者取走 (%d)%n", this.product);
          this.product = -1;

          // 通知等待區中的一個生產者可以繼續工作了
          threadCond.signal();
          }
          finally {
          lock.unlock();
          }
          return p;
          }
          }
          posted on 2008-08-05 08:56 bcterry 閱讀(274) 評論(0)  編輯  收藏

          只有注冊用戶登錄后才能發表評論。


          網站導航:
           

          <2025年7月>
          293012345
          6789101112
          13141516171819
          20212223242526
          272829303112
          3456789

          留言簿

          文章檔案

          搜索

          •  

          最新評論

          主站蜘蛛池模板: 顺昌县| 彭阳县| 陇川县| 鹤峰县| 青阳县| 仁寿县| 桦南县| 泾源县| 宝兴县| 普定县| 五台县| 瑞安市| 巴林左旗| 嘉兴市| 彩票| 琼结县| 阳江市| 登封市| 高要市| 仪陇县| 化州市| 承德县| 浏阳市| 吕梁市| 托里县| 宁海县| 扶风县| 新巴尔虎右旗| 湖州市| 鲁甸县| 桃园市| 新沂市| 邵阳县| 连山| 法库县| 抚顺县| 多伦县| 饶河县| 秦皇岛市| 武平县| 克什克腾旗|