Posted on 2011-10-17 17:28
疯狂 阅读(670)
评论(0) 编辑 收藏 所属分类:
concurrent
Condition(条件) 将 Object 监视器方法(wait
、notify
和 notifyAll
)分解成截然不同的对象,以便通过将这些对象与任意 Lock
实现组合使用,为每个对象提供多个等待 set (wait-set)。其中,Lock 替代了 synchronized 方法和语句的使用,Condition 替代了 Object 监视器方法的使用。
下面解释下Condition api里面的例子(生产者,消费者):
public class ConditionTest {
final Lock lock = new ReentrantLock();
final Condition notFull = lock.newCondition(); //生产者的前提条件,没有达到次条件就阻塞
final Condition notEmpty = lock.newCondition(); //消费者的前提条件,没有达到次条件就阻塞
final Object[] items = new Object[100];
int putptr, takeptr, count;
//生产
public void put(Object x) throws InterruptedException {
lock.lock();
try {
while (count == items.length)//如果满了,就让需要条件为:没满的的线程(生产者)等
notFull.await();
items[putptr] = x;
if (++putptr == items.length) putptr = 0;
++count;
notEmpty.signal();//如果已经生产了,就让需要条件为不为空的线程(消费者)执行
} finally {
lock.unlock();
}
}
//消费
public Object take() throws InterruptedException {
lock.lock();
try {
while (count == 0)//如果为空就让需要条件为不为空的线程(消费者)等
notEmpty.await();
Object x = items[takeptr];
if (++takeptr == items.length) takeptr = 0;
--count;
notFull.signal();//如果消费了,就让条件为不满的线程(生产者)执行
return x;
} finally {
lock.unlock();
}
}
}