-2

我從這個site等待如何重新獲取鎖?

在這兩種生產者和消費者代碼參照生產者 - 消費者例如,等待纏繞內部環,其inturn包裹內部同步塊。

但一旦等待被返回,即從while循環中,我不知道線程是如何重新獲取鎖的,因爲從隊列中添加/刪除項目仍在同步塊內。

另外我覺得我們可能需要兩個不同的鎖,即一個用於消費者,一個用於生產者而不是鎖定整個隊列。因爲我覺得任何時候消費者/生產者都可以在隊列中工作。

如果我的理解錯誤,請讓我知道。如果有人能夠提供兩個不同的鎖,這將是非常好的。

+2

'wait'釋放鎖,等待某人調用'notify()',然後加入一個雷鳴羣體重新獲取它。這一切都發生在內部。你不需要知道它是怎麼發生的,你只需要知道它發生了什麼。你的第二個問題是脫離主題。 – EJP

回答

1

但是一旦等待從while循環,我也不怎麼線程 被重新獲取鎖,因爲從 隊列中添加/刪除的項目仍然是synchronized塊內即返回。

  • 螺紋(生產者或消費者)的線queue.wait(); stucks沒有進展,直到該線程獲得鎖。
  • 一旦獲得鎖定,它就會開始進展,從while循環中出去並進行到queue.notifyAll();。從queue.notifyAll();,它釋放鎖。所以其他線程可以獲得。

而且我覺得我們可能需要兩個不同的鎖,即一個消費者 ,一個用於生產,而不是鎖定整個隊列。因爲我覺得任何時候消費者/生產者都可以在隊列上工作。

這是事實,任一個可以在工作隊列在同一時間。但我們只需要一個鎖。原因是我們有只有一個害怕的資源(隊列)。因此,對這個令人恐懼的資源進行鎖定將確保只有一個人可以同時處理該問題。

希望你明白要點。 :))