
各位大哥 最近小弟遇到一个线程的问题 有个地方不明白 能否帮我说明一下 如下 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();
}
}
} 展开
我想问的是为什么在代码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();
}
}
} 展开
展开全部
判断标记时 while比较安全
被唤醒的线程直接执行等待语句之后的代码,跳过判断语句;这里标记可能会改变,会导致对方重复工作,为了避免take程序多次运行所以循环判断标记。
如果我讲的不清楚可以去看毕向东 javase基础教程14-24.
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询