1. 程式人生 > >理解多線程設計模式

理解多線程設計模式

ges 關鍵字 mage message 消費 模式 ctu 產生 ()

多線程設計模式:
1.Single Threaded Execution Pattern
[同一時刻只允許一個線程操作]

技術分享圖片
比喻:三個挑水的和尚,只能同一時間一個人過橋,不然都掉河裏餵魚了。
總結:在多個線程同時要訪問的方法上加上synchronized關鍵字。


2.Immutable Pattern
[變量賦值一次後只能讀取,不能改變。]
比喻:一夫多妻制,多個妻子共享一個丈夫。一旦賦值,任何一個妻子不能更改共享的 husband為其它人。
總結:將多線程共享的變量用final關鍵字修飾。


3.Guarded Suspension Pattern
[要等到我準備好哦,沒準備好就在門口等著,準備好了再叫你。]

比喻:

GG:小夥子去MM家,敲門...
MM:我在換衣服,稍等。
GG:等待 【調用wait()方法掛起自己的線程】
MM:換好了,進來吧 【調用notify()或著notifyAll()方法通知GG】
總結:判斷某個條件是否為真,如果條件成立則繼續執行一步,如果條件不成立用wait()方法掛起當前線程,條件為真後由另一個線程用notify()或 著notifyAll()方法喚醒掛起的線程。


4.Balking Pattern
[有人在做了?哈哈,太好了,我就不過去了!]

比喻:飯店裏我想好了要點的菜後,高高的舉起手示意服務生過來,一個服務生準備過去的時候看到另外一個服務生已經過去了,哈哈已經有人過去了我就不過去了。
總結:設置一個volatile的共享變量,多個線程進入同一方法時,判斷變量的值是否為真,如果為真說明有人已經在做這個工作了,線程返回,反之將變量賦值為真並執行。

5.Producer-Consumer Pattern
[生產-消費者,你生產蛋榚我來吃。]


比喻(1):一群豬圍著豬食槽的一頭,塞進幾塊玉米餅後,群豬爭先恐後從食槽頭搶,誰搶到誰吃。
比喻(2):一群豬圍著豬食槽的頭和尾,塞進幾塊玉米餅後,群豬爭先恐後從食槽頭和食槽尾搶,誰搶到誰吃。
總結:<1>生產者將生產出來的東西add(E e)到一個Queue,然後喚醒正在從Queue等東西的線程,用poll()方法從隊列的頭獲取到東西,當Queue裏的東西被取完,取東西的線程再次被掛起。
<2>生產者將生產出來的東西放入(方法很多,有add(E e)、addFirst(E e)、addLast(E e)等)一個Deque,然後喚醒正在從Queue等東西的線程,線程從Deque的頭和尾取東西,當Deque裏的東西被取完,取東西的線程再次被掛起。


6.Read-Write Lock Pattern
[學生抄的時候,不允許老師擦掉黑板上的字。]
比喻:老師在黑板上寫了些字,下面的同學在拼命的抄,過會兒老師要寫些新的字,寫新字要擦掉原來的那些,問:都寫完了麽?如果都回答寫完了,就擦掉原來的字寫新的,如果還有一個回答沒寫完,就等待最後一個同學抄完再寫。
總結:Jdk1.5及以上有專門的讀寫鎖實現
java.util.concurrent.locks.ReentrantReadWriteLock.ReadLock;
java.util.concurrent.locks.ReentrantReadWriteLock.WriteLock;
7.Thread-Per-Message Pattern
[一任務一線程]

總結:一個客人一個妞服務,好是好,可是天朝掃黃太厲害,現在狼多肉少哇,用線程池吧,輪流服務。


8.Worker Thread Pattern
[同Producer-Consumer Pattern]


9.Future Pattern
[給您一張提貨單,下午來取。]

比喻:
李剛:大鈔票一摔,來只大蛋榚!
店員:對不起沒這麽大的,但現做,給您張單子,下午xx點來取。
李剛:取貨單??,上面都寫了些啥?
訂單號:SB01
客戶名:李剛
已付款:250
取貨時間:PM2:50

總結:調用某個方法時,這個方法可能需要請求其它系統,這個過程比較耗時,為了提高客戶的體驗需要方法立即返回,過一段時間再查詢結果。
在程序裏聲明一個Hashmap,Key保存訂單號,Value保存生產出的蛋榚,然後根據訂單號取得對應的蛋榚。


10.Two-Phase Termination Pattern
[玩具收拾好,睡覺去]
比喻:小孩子在玩具,到點了媽媽喊:別玩了,睡覺去!
總結:一個線程在while(!isInterrupted()){..}循環中執行,另外一個線程判斷某個條件達到後獲得準備被結束線程的句柄,調用interrupt()
設置線程的中斷狀態。
11.Thread-Specific Storage Pattern
[線程私有物品保管箱]
總結:一個方法可能會被同一個線程訪問多次,如果每訪問一次就要聲明一個數據庫連接的Connection變量,則對程序的性能有影響。將Connection放在ThreadLocal裏,這樣每次訪問就不必再產生一個Connection,同一個線程對應同一個Connection.


12.Active Object[技術分享圖片]

http://sunnylocus.iteye.com/blog/805855

理解多線程設計模式