A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© yangfengxiao 中级黑马   /  2012-10-11 20:46  /  1817 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

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 替换吗?

评分

参与人数 1技术分 +1 收起 理由
唐志兵 + 1 神马都是浮云

查看全部评分

4 个回复

正序浏览
谢谢,谢谢你写的这么清楚。
回复 使用道具 举报
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他老人家在干活

评分

参与人数 1技术分 +1 收起 理由
唐志兵 + 1 赞一个!

查看全部评分

回复 使用道具 举报
可以吧,之前看过API源码的,lock.newCondition(); 返回的实际就是ConditionObject对象 虽然它的返回类型是Condition   这就是面向接口编程,其实这个你可以把后者换到代码中试试就知道了  如果你想了解更多一点  你就可以去看看源码
回复 使用道具 举报
对不起啊,我忘记写注释了。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马