用 Java 實現生產者和消費者的三種方法

生產者消費者問題是多線程的一個經典問題,它描述是有一塊緩衝區做爲倉庫,生產者能夠將產品放入倉庫,消費者則能夠從倉庫中取走產品。安全

在Java中有四種方法支持同步,其中前三個是同步方法,一個是管道方法。多線程

  • wait() / notify()方法
  • await() / signal()方法
  • BlockingQueue阻塞隊列方法

 

wait() / notify()方法

wait() / nofity()方法是基類Object的兩個方法:併發

  • wait()方法:當緩衝區已滿/空時,生產者/消費者線程中止本身的執行,放棄鎖,使本身處於等等狀態,讓其餘線程執行。
  • notify()方法:當生產者/消費者向緩衝區放入/取出一個產品時,向其餘等待的線程發出可執行的通知,同時放棄鎖,使本身處於等待狀態。

 

await() / signal()方法

await()和signal()的功能基本上和wait() / nofity()相同,徹底能夠取代它們,可是它們和新引入的鎖定機制 Lock 直接掛鉤,具備更大的靈活性。經過在Lock對象上調用newCondition()方法,將條件變量和一個鎖對象進行綁定,進而控制併發程序訪問競爭資源的安全。spa

 

BlockingQueue

它是一個已經在內部實現了同步的隊列,實現方式採用的是咱們第2種await() / signal()方法。它能夠在生成對象時指定容量大小。它用於阻塞操做的是put()和take()方法:線程

put()方法:相似於咱們上面的生產者線程,容量達到最大時,自動阻塞。對象

take()方法:相似於咱們上面的消費者線程,容量爲0時,自動阻塞。隊列

相關文章
相關標籤/搜索