Discuss / Java / 是不是可以用两个if代替while,保证可以remove

是不是可以用两个if代替while,保证可以remove

Topic source

PBC

#1 Created at ... [Delete] [Delete and Lock User]
public synchronized String getTask() throws InterruptedException {
 if (queue.isEmpty()) {
   this.wait();
 }
 if (queue.isEmpty()) {
   return queue.remove();
 }
 return null; }

保持热爱

#2 Created at ... [Delete] [Delete and Lock User]

不行,首先你第二个if逻辑是错的,忘了取反,

但第二个 if 改为 if(!queue.isEmpth()) 后也不行,

如果多个读取线程调用getTask()方法,进入等待状态,

这时addTask()里使用的是notifyAll()而不是notify(),就会出现问题

只有一个读取线程可以正常执行,另外的几个都会返回null,线程结束,不符合案例需要,案例需要的是如果队列为空,则等待不为空时取数据返回

保持热爱

#3 Created at ... [Delete] [Delete and Lock User]

isEmpty

🌙

#4 Created at ... [Delete] [Delete and Lock User]

肯定,不可以

该线程执行queue.remove()可以获取到队列的元素,然而,剩下的线程如果获取this锁后执行queue.remove(),此刻队列可能已经没有任何元素了

主要原因是,空队列调用remove()方法会报:NoSuchElementException

🌙

#5 Created at ... [Delete] [Delete and Lock User]

楼上说的对,

🌙

#6 Created at ... [Delete] [Delete and Lock User]

你的返回值有问题


  • 1

Reply