-2

我从这个site等待如何重新获取锁?

在这两种生产者和消费者代码参照生产者 - 消费者例如,等待缠绕内部环,其inturn包裹内部同步块。

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

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

如果我的理解错误,请让我知道。如果有人能够提供两个不同的锁,这将是非常好的。

+2

'wait'释放锁,等待某人调用'notify()',然后加入一个雷鸣群体重新获取它。这一切都发生在内部。你不需要知道它是怎么发生的,你只需要知道它发生了什么。你的第二个问题是脱离主题。 – EJP

回答

1

但是一旦等待从while循环,我也不怎么线程 被重新获取锁,因为从 队列中添加/删除的项目仍然是synchronized块内即返回。

  • 螺纹(生产者或消费者)的线queue.wait(); stucks没有进展,直到该线程获得锁。
  • 一旦获得锁定,它就会开始进展,从while循环中出去并进行到queue.notifyAll();。从queue.notifyAll();,它释放锁。所以其他线程可以获得。

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

这是事实,任一个可以在工作队列在同一时间。但我们只需要一个锁。原因是我们有只有一个害怕的资源(队列)。因此,对这个令人恐惧的资源进行锁定将确保只有一个人可以同时处理该问题。

希望你明白要点。 :))