黑马程序员技术交流社区
标题:
大家帮忙看看下面的代码
[打印本页]
作者:
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