这里为什么用while 不用 if ?

图片说明

public class BoundedQueue<T> {
private Object[] items;
// 添加的下标,删除的下标和数组当前数量
private int addIndex, removeIndex, count;
private Lock lock = new ReentrantLock();
private Condition notEmpty = lock.newCondition();
private Condition notFull = lock.newCondition();
public BoundedQueue(int size) {
items = new Object[size];
}
// 添加一个元素,如果数组满,则添加线程进入等待状态,直到有"空位"
public void add(T t) throws InterruptedException {
lock.lock();
try {
while (count == items.length)
notFull.await();
items[addIndex] = t;
if (++addIndex == items.length)
addIndex = 0;
++count;
notEmpty.signal();
} finally {
lock.unlock();
}
}
// 由头部删除一个元素,如果数组空,则删除线程进入等待状态,直到有新添加元素
@SuppressWarnings("unchecked")
public T remove() throws InterruptedException {
lock.lock();
try {
while (count == 0)
notEmpty.await();
Object x = items[removeIndex];
if (++removeIndex == items.length)
removeIndex = 0;
--count;
notFull.signal();
return (T) x;
} finally {
lock.unlock();
}
}
}

while 是一直等待条件满足,如果是if 只是判断一下。

多线程的吧,,多线程里的等待,是需要死循环的用,if直接跳到后面了

当然也有其他做等待的技巧

重新回答一下这个问题,示例代码程序有问题,当队列元素满时,调用add()方法,会造成lock锁住,然后程序一直wait等待,此时无也法调用remove()方法,因为它也要占用lock。

就像注释里面写的“”如果.....直到“”,如果用if是判断之后不满足就不进入方法,满足进入方法执行一次就完了不再进行判断,而while是进入执行一直到满足条件才走出循环。当然要用while。

这个是要等到满足条件才能执行后面的,if只会执行一次,就会执行后面的代码了

在条件成功的情况下,需要一直等,不成功的情况下,执行后面
如果用if,条件成功的话,不会一直等

想想也就知道了,代码执行到while的时候while里面并没有迭代条件 那么它就会一直在while里 不执行后面,那什么时候执行后面的呢什么时候跳出循环呢?多线程当有满足while条件退出的线程执行后面的代码,如果是改成if那么满足if条件执行了if里的还会执行后面的代码所以就不合你的业务逻辑了

因为要做循环功能啊,while的作用有:1.在符合条件的范围内循环 2.当条件不成立了,就退出循环。而if只是一个判断作用,在这里需要while来实现整体功能

当有多个生产者和消费者的时候,用 if 会出现错误