Java多线程同步设计中使用Metux[3]
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]](http://img.zhputi.com/uploads/7585/7585db12325f13e29fb75feaa5cae46517821.jpg)
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