如何重新获取锁定?

时间:2016-12-01 05:40:07

标签: java multithreading design-patterns concurrency producer-consumer

我指的是此site

中的生产者 - 消费者示例

在生产者代码和消费者代码中,等待包含在循环中,循环包含在同步块中。

但是一旦等待返回,即从while循环返回,我不知道线程如何重新获取锁定,因为从队列中添加/删除项目仍在同步块内。

另外我觉得我们可能需要两个不同的锁,一个用于消费者,一个用于生产者,而不是锁定整个队列。因为我觉得消费者/生产者可以随时在队列中工作。

如果我的理解是错误的,请告诉我。如果有人能够为这个例子提供两个不同的锁,那也很棒。

1 个答案:

答案 0 :(得分:1)

  

但是一旦等待返回,即从while循环,我不知道线程如何   正在重新获取锁定,因为从中添加/删除项目   队列仍在同步块内。

  • 线程(生产者或消费者)在没有进展的情况下卡在行queue.wait();中,直到该线程获得锁定。
  • 一旦获得锁定,它将开始进展,从while循环中退出并继续进行queue.notifyAll();。从queue.notifyAll();开始,它会释放锁定。这样其他线程就可以获得它。
  

此外,我觉得我们可能需要两个不同的锁,即一个用于消费者   和一个生产者而不是锁定整个队列。因为我   任何时候消费者/生产者都可以在队列中工作。

确实 其中一个可以同时处理队列 。但我们 只需要一个锁 。原因是我们只有 一个害怕的资源 (队列)。因此,锁定该可怕资源将确保只有一个可以同时处理该资源。

希望你明白这一点。 :))