并發是一種解耦策略,它幫助我們把做什么(目的)和何時(時機)做分解開。在單線程應用中,目的與時機緊密耦合,很多時候只要查看堆棧追蹤即可斷定應用程序的狀態。而解耦目的與時機能明顯地改進應用程序的吞吐量和結構。從結構的角度看,應用程序看起來更像是許多臺協同工作的計算機,而不是一個大循環。單線程程序許多時間花在等待Web套接字I/O結束上面。
下面是一些有關編寫并發軟件的中肯的說法: ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?并發會在性能和編寫額外代碼上增加一些開銷。 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 正確的并發是復雜的,即使對于簡單的問題也是如此。 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?并發缺陷并非總能重現,所以常被看做偶發事件而忽略,而未被當做真的缺陷看待。 ? ? ? ? ? 并發常常需要對設計策略的根本性修改。
下面給出一些防御并發代碼問題的原則和技巧: ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?單一權責原則(分離并發代碼和其他代碼) ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?限制數據作用域(謹記數據封裝即臨界區,嚴格限制對可能被共享的數據的訪問) ? ? ? ? ? ? ? ? ? ?使用數據復本 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?線程應盡可能地獨立 ? ?
了解Java庫,保證線程安全掌握 java.util.concurrent、java.util.concurrent.atomic和java.util.concurrent.locks.
了解執行模型的一些基礎定義:
在并發編程中用到的幾種執行模型:
1)生產者-消費者模型 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 一個或多個生產者線程創建某些工作,并置于緩存或者隊列中。一個或者多個消費者線程從隊列中獲取并完成這些工作。生產者和消費者之間的隊列是一種限定資源。
2)讀者-作者模型。 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 當存在一個主要為讀者線程提供信息源,但只是偶爾被作者線程更新的共享資源,吞吐量就會是個問題。增加吞吐量,會導致線程饑餓和過時信息的積累。協調讀者線程不去讀取正在更新的信息,而作者線程傾向于長期鎖定讀者線程。
3)宴席哲學家。 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 許多企業級應用中會存在進程競爭資源的情形,如果沒有用心設計,這種競爭會遭遇死鎖,活鎖,吞吐量和效率低等問題。
PS:代碼整潔之道對并發的講解還不是那么的清晰,要掌握怎么正確使用并發,自己還是需要去專門看看這方面的書。