【问题标题】:How wait reacquire the lock?如何等待重新获得锁?
【发布时间】:2023-04-07 07:58:01
【问题描述】:

我指的是来自site 的生产者-消费者示例

在生产者和消费者代码中,wait 被包裹在循环中,而循环又被包裹在 synchronized 块中。

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

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

如果我的理解有误,请告诉我。如果有人可以为示例提供两个不同的锁,那就太好了。

【问题讨论】:

  • wait 释放锁,等待有人调用notify(),然后加入雷鸣般的羊群重新获得它。这一切都发生在内部。你不需要知道它是如何发生的,你只需要知道它发生的那个。你的第二个问题跑题了。

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


【解决方案1】:

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

  • 线程(生产者或消费者)卡在queue.wait(); 行中而没有进展,直到该线程获得锁。
  • 一旦它获得锁,它就会开始前进,从while循环中出去,一直前进到queue.notifyAll();。从queue.notifyAll();,它释放锁。以便其他线程可以获取它。

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

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

希望您能理解要点。 :))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-07-10
    • 1970-01-01
    • 2012-11-05
    • 1970-01-01
    • 2015-10-17
    • 2023-03-15
    • 1970-01-01
    相关资源
    最近更新 更多