1. 程式人生 > >我的多線程—多線程與設計模式閱讀筆記

我的多線程—多線程與設計模式閱讀筆記

圖解java多線程與設計模式 多線程 設計模式

java多線程與設計模式

1.Producer-Consumer模式 我來做,你來用 命名生產消費者模式. 生產者和消費者只有一個成為Pipe模式

如何解決兩者之間處理速度差異的問題?


data

|

|

|

Producer --> Channel <-- Consumer

如何解決剩余空間的問題?如何解決內存溢出的問題?

傳遞順序有哪些?優先隊列如何實現?



2.Read-Write Lock模式

讀等待寫模式。 讀寫分離,讀取的鎖和寫入的鎖分開。

如何實現讀寫分離?執行互斥處理會降低程序的性能

ReadWriteLock類如何提供讀寫鎖?Before/After模式

ReadWriteLock模式

讀方法禮讓寫方法

物理鎖 -----> 邏輯鎖



3.Thread-Per-Message模式。 給你我就不管了模式

每個消息一個線程

每個命令或請求分配一個線程

“委托端”和“執行端”是不同的線程

角色:Client(請求發動者)。 Host(請求接收者 線程創建者)。 Helper助手(處理請求者)---->達到異步執行的操作

優點:明顯提高程序的響應性,降低時間

handle操作花費的時間 和 線程啟動花費的時間

適用場景:適用於操作順序沒有要求時,適用於不需要返回值時


4.Immutable模式 不變模式 安全模式

內部狀態不會發生變化,不變的,安全的,只有一個入口,只是為了明確編程人員的意圖

1.實例被創建且字段被初始化之後,字段值就不會修改final

2.多個線程同時執行也沒有關系

3.優點不需要synchonized保護



5.Single Threaded Execution模式 獨木橋模式

萬人搶獨木橋模式


----------->

----------->

-----------> ---------> 一次只允許一個人通過(Synchonized)

----------->

----------->


6.Guarded Suspension模式 為了保護而等待模式

while - wait - notify模式

消息隊列作為中間人

應該將什麽作為施加守護條件(必須要滿足的條件)?

為什麽使用while?哈哈

線程等待什麽?notify?狀態改變?

什麽是前置條件(守護條件)?

關鍵角色“:GuardedObject 被保護的對象 保護的方法 狀態改變的方法



7.Balking模式 1>不吃不給飯(不執行),吃的話就讓你吃一次(狀態只改變一次)模式

沒有Guarded Suspension那麽好的脾氣,不等待,不執行

沒有Guarded Suspension那麽反復,狀態只改變一次

狀態只改變一次,通常稱為閉鎖(畢+索)

優點:已經執行過了或者其他情況不需要再次執行,直接balk

提高程序的響應性

balk結果的表達方式?忽略 返回值 異常



8.Woker Thread模式。工人模式 線程池模式

委托者將任務交給工廠,工廠將任務分派給工人,工人完成任務模式

1>工人做的任務是一樣的 2>每次啟動線程浪費時間,提高吞吐量

多余的工人不幹活只吃飯也是一個問題?



9.Future模式 填寫單子(數據的預處理和封裝 不完整的數據)排隊(等待)業務完成(完整的數據)

處理業務 和 獲取結果 去搶獨木橋(分離)


10.Two-Phase Termination模式

如何使用多線程實現計數器,並能隨意停止?

該模式角色:中介請求

interrupt立即結束線程




11. Thread - Specific Storage模式。 線程倉庫模式,每個線程都有自己單獨的倉庫。 ----似曾相識的老朋友

認識java.lang.ThreadLocal類 get 和 set方法

人物情節?委托者將任務交給代理proxy,代理從倉庫中獲取當前現線程執行者執行當前任務

優點:可能不會提高吞吐量,1>不存在顯示地執行互斥處理。2>不改變結構即可實現程序 不加synchonized等關鍵字

缺點:引入上下文隱藏了一些信息,難以找到bug的原因


課外閱讀:ThreadLocal倉庫的生命周期?

線程特有信息存儲的位置?線程外和線程內(廢話啊),線程內和線程外存儲信息的區別?想象錢哪裏?有啥子區別?

最低限度互斥處理原則,減少不必要的sharedResource


延伸閱讀:Doug Lea提出:基於角色(完成不同任務的線程)、任務(任務抽離,各個線程都可以執行,例如線程池)、角色和任務合並這三種考慮方式




12.Active Object模式。 接受異步消息的主動對象 難懂的模式,武林秘籍的最後一招啦

模式集合體:Future模式getResult

這個模式發生了什麽啊??? 線程池模式 Future模式 主動對象模式



main 測試程序行為的類


MakerClientThread 組裝字符串的線程

DisplayClientThread 顯示字符串的線程


ActiveObject接口 組裝和展示字符串的


ActiveObjectFactory 創建主動信息的工廠


Servant真正makeString 和 displayString的類。 實現ActiveObject接口


Result結果的接口,獲取結果

FutureResult Future模式

RealResult 實際執行的結果


MethodRequest 表示請求的抽象類

DisplayStringRequest類 展示字符串的請求類

MakeStringRequest類 組裝字符串的請求類



ActivationQueue類 線程池類


SchedularThread 將請求交給線程池的類





線程擴展閱讀:

1>認識InterruptedException:花費時間 可以取消。 interrupt只是改變線程的狀態,wait的時候會檢測這種狀態拋出異常。isInterrupted檢查中斷狀態

sleep和interrupt方法,打斷我睡覺,報警啦(拋出異常)!!!

wait和interrupt方法,讓我靜會,你敢吵我,等我反應過來(獲取lock),我會報警啦(拋出異常)!!!

notify和interrupt方法的區別

不要使用Thread的stop方法


2>BlockingQueue接口--阻塞隊列

基於ArrayBlockingQueue、LinkedBlockingQueue、PriorityBlockingQueue、DelayQueue、SynchronousQueue、ConcurrentLinkedQueue(無最大限制)


3>進程內存獨立,線程內存共享 進程上下文切換繁瑣。 線程上下文切換簡單

再次了解ThreadFactory接口

代碼完全不需要修改,說明所用的類可復用性很高

Executors.defaultThreadFactory()創建線程工廠


4>Thread。創建啟動線程的類

Runnable 線程所執行的“工作”的接口

ThreadFactory 將線程的創建抽象化了的接口

Executor 接口,將線程執行抽象化了的接口

ExecutorService 將被復用的線程抽象化了的接口

Executors 創建實例的工具類


5>synchonized{}和before-after設計模式?synchonized保護著什麽?synchonized以什麽單位保護?使用哪個鎖保護?

什麽是原子操作?long和double不是原子操作


6>認識Semphore計數信號量 acquire方法 和 release方法


7>集合與多線程:

利用Collections.synchonizedList方法進行同步

使用copy-on-write的 CopyOnWriteArrayList類。 寫的時候復制,寫的少會很劃算


8>Guarded Suspension = 附加條件的synchronized模式 (解釋完美)=多線程的if

生存性面臨挑戰(加超時時間結局)

busy wait忙於等待 yield看電影女友還沒來,先讓其他排隊的人進,一種禮讓

java.util.concurrent.BlockingQueue 阻塞隊列的概念


9>balk使用的條件:不需要執行時,不需要等待守護條件成立時,守護條件盡在第一次成立時

balk結果的表示方式:忽律balk,返回值,異常


10>guarded timed或timeout 超時

wait(等待的時間) Allen Holub著作(If I Were King)

什麽時候可以設置等待超時?



11>好玩的實例?如何使用java.util.concurrrent.Exchanger類交換緩沖區 666 這個有點厲害

傳遞緩沖區後,作為交換,接受空的緩沖區(重點)



12>java.util.concurrent.locks.ReentrantReadWriteLock 使用before-after模式實現了讀寫分離


13>理解GUI事件分發


14>ThreadPoolExecutor類 線程池


15>jva.util.concurrent包中的Callable類實現回調



。。。未完待續










我的多線程—多線程與設計模式閱讀筆記