我指的是此site
中的生产者 - 消费者示例在生产者代码和消费者代码中,等待包含在循环中,循环包含在同步块中。
但是一旦等待返回,即从while循环返回,我不知道线程如何重新获取锁定,因为从队列中添加/删除项目仍在同步块内。
另外我觉得我们可能需要两个不同的锁,一个用于消费者,一个用于生产者,而不是锁定整个队列。因为我觉得消费者/生产者可以随时在队列中工作。
如果我的理解是错误的,请告诉我。如果有人能够为这个例子提供两个不同的锁,那也很棒。
答案 0 :(得分:1)
但是一旦等待返回,即从while循环,我不知道线程如何 正在重新获取锁定,因为从中添加/删除项目 队列仍在同步块内。
queue.wait();
中,直到该线程获得锁定。 queue.notifyAll();
。从queue.notifyAll();
开始,它会释放锁定。这样其他线程就可以获得它。此外,我觉得我们可能需要两个不同的锁,即一个用于消费者 和一个生产者而不是锁定整个队列。因为我 任何时候消费者/生产者都可以在队列中工作。
确实 其中一个可以同时处理队列 。但我们 只需要一个锁 。原因是我们只有 一个害怕的资源 (队列)。因此,锁定该可怕资源将确保只有一个可以同时处理该资源。
希望你明白这一点。 :))