黑马程序员技术交流社区

标题: 大家帮忙看看下面的代码 [打印本页]

作者: yangfengxiao    时间: 2012-10-11 20:46
标题: 大家帮忙看看下面的代码
class BoundedBuffer {
  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();
  }
  }  
}

第三行的lock.newCondition(); 可以被new AbstractQueuedSynchronizer.ConditionObject 替换吗?
作者: yangfengxiao    时间: 2012-10-11 21:51
对不起啊,我忘记写注释了。
作者: 柏占肖    时间: 2012-10-11 22:01
可以吧,之前看过API源码的,lock.newCondition(); 返回的实际就是ConditionObject对象 虽然它的返回类型是Condition   这就是面向接口编程,其实这个你可以把后者换到代码中试试就知道了  如果你想了解更多一点  你就可以去看看源码
作者: 李建强    时间: 2012-10-12 08:55
ReentrantLock 类中定义了一个内部类Sync继承自AbstractQueuedSynchronizer
    public Condition newCondition() {
        return sync.newCondition();
    }
sync内部类中
    final ConditionObject newCondition() {
         return new ConditionObject();
    }
//下面是ReentrantLock类的hasWaiters方法,返回的是内部类sync.hasWaiters方法
    public boolean hasWaiters(Condition condition) {
        if (condition == null)
            throw new NullPointerException();
        if (!(condition instanceof AbstractQueuedSynchronizer.ConditionObject))
            throw new IllegalArgumentException("not owner");
        return sync.hasWaiters((AbstractQueuedSynchronizer.ConditionObject)condition);
    }
//下面是sync.hasWaiters方法,return sync.hasWaiters((AbstractQueuedSynchronizer.ConditionObject)condition);
    public boolean hasWaiters(Condition condition) {
        if (condition == null)
            throw new NullPointerException();
        if (!(condition instanceof AbstractQueuedSynchronizer.ConditionObject))
            throw new IllegalArgumentException("not owner");
        return sync.hasWaiters((AbstractQueuedSynchronizer.ConditionObject)condition);
    }
最终,还是AbstractQueuedSynchronizer他老人家在干活
作者: yangfengxiao    时间: 2012-10-12 19:47
谢谢,谢谢你写的这么清楚。




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2