1. 程式人生 > >java併發程式設計----併發模型

java併發程式設計----併發模型

  在繼續下面的探討之前,我們還是重溫一下幾個概念:

概念 解釋
臨界資源 併發環境中有著固定數量的資源
互斥 對資源的訪問是排他式的
飢餓 一個或一組執行緒長時間或永遠無法取得進展
死鎖 兩個或多個執行緒相互等待對方結束
活鎖 想要執行的執行緒總是發現其他的執行緒正在執行以至於長時間或永遠無法執行



  重溫了這幾個概念後,我們可以探討一下下面的幾種併發模型。

生產者-消費者

  一個或多個生產者建立某些工作並將其置於緩衝區或佇列中,一個或多個消費者會從佇列中獲得這些工作並完成之。這裡的緩衝區或佇列是臨界資源。當緩衝區或佇列放滿的時候,生產這會被阻塞;而緩衝區或佇列為空的時候,消費者會被阻塞。生產者和消費者的排程是通過二者相互交換訊號完成的。

讀者-寫者

  當存在一個主要為讀者提供資訊的共享資源,它偶爾會被寫者更新,但是需要考慮系統的吞吐量,又要防止飢餓和陳舊資源得不到更新的問題。在這種併發模型中,如何平衡讀者和寫者是最困難的,當然這個問題至今還是一個被熱議的問題,恐怕必須根據具體的場景來提供合適的解決方案而沒有那種放之四海而皆準的方法(不像我在國內的科研文獻中看到的那樣)。

哲學家進餐

  1965年,荷蘭電腦科學家圖靈獎得主Edsger Wybe Dijkstra提出並解決了一個他稱之為哲學家進餐的同步問題。這個問題可以簡單地描述如下:五個哲學家圍坐在一張圓桌周圍,每個哲學家面前都有一盤通心粉。由於通心粉很滑,所以需要兩把叉子才能夾住。相鄰兩個盤子之間放有一把叉子如下圖所示。哲學家的生活中有兩種交替活動時段:即吃飯和思考。當一個哲學家覺得餓了時,他就試圖分兩次去取其左邊和右邊的叉子,每次拿一把,但不分次序。如果成功地得到了兩把叉子,就開始吃飯,吃完後放下叉子繼續思考。 
  把上面問題中的哲學家換成執行緒,把叉子換成競爭的臨界資源,上面的問題就是執行緒競爭資源的問題。如果沒有經過精心的設計,系統就會出現死鎖、活鎖、吞吐量下降等問題。 
這裡寫圖片描述