【发布时间】:2014-10-19 13:36:57
【问题描述】:
我正在尝试让我的生产者/消费者正常工作,但我故意不想在这里使用 BlockingQueue 来了解更详细的信息。我知道当我调用 object.wait() 时,线程会释放它的锁并进入 WAITING 状态,直到有人通知(notify/notifyAll)它回到 BLOCKED 状态,如果它获得锁,这个线程将进入 RUNNABLE。
private class Consumer implements Runnable{
private final MyQueue<Integer> queue;
public Consumer(MyQueue<Integer> queue){
this.queue = queue;
}
@Override
public void run(){
while(true){
synchronized (queue) {
//Block till new available
while(queue.isEmpty()){
try {
queue.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
//Consume
queue.dequeue();
queue.notifyAll(); //Notify people waiting on queue full condition
}
}
}
}
我的问题是有可能(关于上面的代码):
- 我的线程正在等待,等待后醒来(有人通知) 我得到了锁
- 我做了一个检查 queue.isEmpty(),它不是空的,执行到下一行
- 就在执行下一行 queue.dequeue() 之前,CPU 上下文切换了我的线程。
- 接下来,当我获得 CPU 切片并锁定时,我运行 queue.dequeue() 并说队列为空
我知道通常的 CPU 调度程序会为每个线程分配一定的时间,以避免上下文切换成本。
【问题讨论】:
标签: java multithreading wait producer-consumer context-switch