各位大哥 最近小弟遇到一个线程的问题 有个地方不明白 能否帮我说明一下 如下 5

这是JDK自带的一个缓冲区代码实例多个线程可以冲这个数据缓冲区拿/放数据我想问的是为什么在代码1和2处要加while循环而不用if希望越详细越好不知道的请不要乱说这个东西... 这是JDK自带的一个缓冲区代码实例 多个线程可以冲这个数据缓冲区拿/放数据
我想问的是为什么在代码1和2处要加while循环 而不用if 希望越详细越好 不知道的请不要乱说 这个东西困扰了我很久 在此请教
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();//代码1
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();//代码2
Object x = items[takeptr];
if (++takeptr == items.length) takeptr = 0;
--count;
notFull.signal();
return x;
} finally {
lock.unlock();
}
}
}
展开
 我来答
独白王涛
2017-01-25
知道答主
回答量:1
采纳率:0%
帮助的人:1136
展开全部

判断标记时 while比较安全

被唤醒的线程直接执行等待语句之后的代码,跳过判断语句;这里标记可能会改变,会导致对方重复工作,为了避免take程序多次运行所以循环判断标记。

如果我讲的不清楚可以去看毕向东 javase基础教程14-24.

念念小卿00X
2012-10-30
知道答主
回答量:71
采纳率:0%
帮助的人:32.8万
展开全部
啥子玩意
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式