2011-11-20 84 views
3

我知道這是一個重複的問題。但我無法理解的解釋。 我想通過一個很好的例子來清楚地理解它。任何人都可以幫忙。等待,從同步的上下文中通知方法

「爲什麼我們從同步的上下文中調用wait(),notify()方法」。

+0

任何人都可以請回答。 – aj983

+0

如果您不想尋找同步,等待並通知並不意味着什麼。如果你不使用它們進行同步,它們是無效的。 – ben

+0

我知道那位先生。但我在問什麼是從同步上下文中調用它們的原因。 – aj983

回答

0

當我們在線程中使用同步時,這意味着我們對該對象進行了鎖定,並且該對象一次只能由一個線程使用,以避免各種併發問題。

wait()和notify()方法僅用於同步上下文。

等待方法暫停當前線程的工作並釋放它保留在任何對象上的鎖,以便其他線程可以使用該同步對象。

當其他線程完成其工作時,它會調用notify方法,這會導致第一個線程再次獲取對象上的鎖定並恢復其工作。

你可以很容易地從網上獲得例子。

0

我們主要使用wait()和notify()或notifyAll()方法進行線程間通信。

一個線程在檢查條件後正在等待,例如在生產者消費者示例生產者線程正在等待緩衝區已滿並且消費者線程通過消費元素在緩衝區中創建空間之後通知生產者線程。調用notify()或notifyAll()向單個或多個線程發出條件已更改的通知,並且一旦通知線程離開synchronized塊,正在等待的所有線程都會爭奪它們正在等待的對象鎖定,並且幸運線程返回wait()方法重新獲取鎖後繼續。讓我們分裂步驟這整個操作看的等待(之間的競爭條件的可能性)和notify()方法在Java中,我們將使用生產的消費線程的例子來理解的情況下更好地:

  1. 生產者線程測試條件(緩衝區已滿或未滿)並確認它必須等待(查找緩衝區已滿)。
  2. Consumer線程在從緩衝區中消耗一個元素後設置條件。
  3. Consumer線程調用notify()方法;這是聞所未聞的,因爲生產者線程尚未等待。
  4. 生產者線程調用wait()方法並進入等待狀態。

因此,由於競爭條件,我們可能會失去通知,如果我們使用緩衝區或只有一個元素產生線程將永遠等待,您的程序將掛起。總之,爲了避免競爭條件,wait(),notify()和notifyAll()被從同步的上下文中調用。

HTH。

+0

或者你可以給這個鏈接 - http ://javarevisited.blogspot。COM/2011/05 /等待通知-和notifyAll的功能於java.html – Anshu