熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Java編程 >> Java高級技術 >> 正文

Java多線程同步設計中使用Metux[3]

2022-06-13   來源: Java高級技術 

    為什麼要在acquire()和attempt(方法的開始都要檢查當前線程的中斷標志呢?這是為了在當前線程已經被打斷時可以立即返回而不會仍然在鎖標志上等待調用一個線程的interrupt()方法根據當前線程所處的狀態可能產生兩種不同的結果當線程在運行過程中被打斷則設置當前線程的中斷標志為true;如果當前線程阻塞於wait()sleep()join()則當前線程的中斷標志被清空同時拋出InterruptedException所以在上面代碼的位置()也捕獲了InterruptedException然後再次拋出InterruptedException

    release()方法簡單地重置inuse_標志並通知其它線程

    attempt()方法是利用Java的Objectwait(long)進行計時的由於Objectwait(long)不是一個精確的時鐘所以attempt(long)方法也是一個粗略的計時注意代碼中位置(在超時時返回

    Mutex是Sync的一個基本實現除了實現了Sync接口中的方法外並沒有添加新的方法所以Mutex的使用和Sync的完全一樣在concurrent包的API中Doug給出了一個精細鎖定的List的實現示例我們這兒也給出作為對Mutex和Sync使用的一個例子

 
class Node
{
 Object item; Node next;
 Mutex lock = new Mutex();
 // 每一個節點都持有一個鎖
 Node(Object x Node n)
 {
  item = x;
  next = n;
 }
}
class List
{
 protected Node head;
 // 指向列表的頭
 // 使用Java的synchronized保護head域
 // (我們當然可以使用Mutex但是這兒似乎沒有這樣做的必要
 
 protected synchronized Node getHead()
 { return head; }
 boolean search(Object x) throws InterruptedException
 {
  Node p = getHead();
  if (p == null) return false;
  // (這兒可以更加緊湊但是為了演示的清楚各種情況都分別進行處理)
  plockacquire();
  // Prime loop by acquiring first lock
  // (If the acquire fails due to
  // interrupt the method will throw
  // InterruptedException now
  // so there is no need for any
  // further cleanup)
  for (;;)
  {
   if (xequals(pitem))
   {
    plockrelease();
    // 釋放當前節點的鎖
    return true;
   }
   else
   {
    Node nextp = pnext;
    if (nextp == null)
    {
     plockrelease();
     // 釋放最後持有的鎖
     return false;
    }
    else
    {
     try
     {
      nextplockacquire();
      // 在釋放當前鎖之前獲取下一個節點的鎖
     }
     catch (InterruptedException ex)
     {
      plockrelease();
      // 如果獲取失敗也釋放當前的鎖 throw ex;
     }
     plockrelease();
     // 釋放上個節點的鎖現在已經持有新的鎖了
     p = nextp;
    }
   }
  }
 }
 synchronized void add(Object x)
 {
  // 使用synchronized保護head域
  head = new Node(x head);
 }
 // other similar traversal and update methods
}

[]  []  []  


From:http://tw.wingwit.com/Article/program/Java/gj/201311/27681.html
    推薦文章
    Copyright © 2005-2022 電腦知識網 Computer Knowledge   All rights reserved.