您现在的位置是:首页 >

Java多线程同步设计中使用Metux[3]

火烧 2022-02-27 12:18:40 1063
Java多线程同步设计中使用Metux[3] 为什么要在acquire()和attem t( 方法的开始都要检查当前线程的中断标志呢?这是为了在当前线程已经被打断时 可以立即返回 而不会仍然在锁标志上

Java多线程同步设计中使用Metux[3]  

    为什么要在acquire()和attempt( 方法的开始都要检查当前线程的中断标志呢?这是为了在当前线程已经被打断时 可以立即返回 而不会仍然在锁标志上等待 调用一个线程的interrupt()方法根据当前线程所处的状态 可能产生两种不同的结果 当线程在运行过程中被打断 则设置当前线程的中断标志为true;如果当前线程阻塞于wait() sleep() join() 则当前线程的中断标志被清空 同时抛出InterruptedException 所以在上面代码的位置( )也捕获了InterruptedException 然后再次抛出InterruptedException

    release()方法简单地重置inuse_标志 并通知其它线程

    attempt()方法是利用Java的Object wait(long)进行计时的 由于Object wait(long)不是一个精确的时钟 所以attempt(long)方法也是一个粗略的计时 注意代码中位置( ) 在超时时返回

    Mutex是Sync的一个基本实现 除了实现了Sync接口中的方法外 并没有添加新的方法 所以 Mutex的使用和Sync的完全一样 在concurrent包的API中Doug给出了一个精细锁定的List的实现示例 我们这儿也给出 作为对Mutex和Sync使用的一个例子

Java多线程同步设计中使用Metux[3]

 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;  // (这儿可以更加紧凑 但是为了演示的清楚 各种情况都分别进行处理)  p lock acquire();  // 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 (x equals(p item))   {    p lock release();    // 释放当前节点的锁    return true;   }   else   {    Node nextp = p next;    if (nextp == null)    {     p lock release();     // 释放最后持有的锁     return false;    }    else    {     try     {      nextp lock acquire();      // 在释放当前锁之前获取下一个节点的锁     }     catch (InterruptedException ex)     {      p lock release();      // 如果获取失败 也释放当前的锁 throw ex;     }     p lock release();     // 释放上个节点的锁 现在已经持有新的锁了     p = nextp;    }   }  } } synchronized void add(Object x) {  // 使用synchronized保护head域  head = new Node(x head); } // other similar traversal and update methods }

lishixinzhi/Article/program/Java/gj/201311/27681  
永远跟党走
  • 如果你觉得本站很棒,可以通过扫码支付打赏哦!

    • 微信收款码
    • 支付宝收款码