Java多線程設計模式概要

尋夢新聞LINE@每日推播熱門推薦文章,趣聞不漏接❤️

加入LINE好友

多線程設計模式

設計模式,來自建築學,通過觀察大量的建築設計,總結出來的一套最常用的設計方法,遷移到計算機領域,就是如何很好的設計類與類之間的關係和交互,做到低耦合,高內聚的設計。

⑴single Thread Execution 模式:

Synchronized同步方法,當多線程訪問臨界資源的時候,為了防止並發導致的數據不一致問題,所以使用Synchronized同步,讓同一時刻只有一個線程訪問臨界資源,其他線程訪問臨界資源,會被阻塞,放入到訪問臨界資源的等待隊列中,直到線使用完臨界資源,釋放鎖,然後其他對象才可以獲取鎖,訪問臨界資源。

⑵immutable 模式:

在Java中,基本類型的賦值和訪問具有原子性,不可分割,即操作不會被干擾,但long,double類型變量不具有原子性(在32位操作系統上),我們可以想到數據庫的事務,也具有原子性,即要麼全部執行,要麼不執行,當我們訪問的對象具有原子性,則這個操作也不會被中斷的。舉例,有一個變量,有讀寫兩個方法,當涉及寫的方法時,就應該停止讀操作,我們常用的方法時同步讀寫操作,我們這樣做,其目的是讓讀這個操作不被打斷。

不可變對象,即使用final關鍵字修飾變量,沒有set方法,標準類庫中使用的不可變模式,字符串的Java.lang.String類,Java.lang.Integer類,

⑶Guarded Supension模式:

GuardedObject是一個持有被守護的方法的類,當線程執行grardedMethod方法時,若守護條件成立,則立即執行,當守護條件不成立時,就要進行等待,guardedMethod方法通過while()和wait()方法來做到,stateChangingMethod則通過notify()或notifyAll()方法來做到。

即通過一個條件是否,來決定進入的線程是否繼續執行下次,如果條件成立,則執行下面的代碼,如果條件不成立,則進入的線程進入等待隊列,直到條件成立,則會被喚醒,繼續執行。

注意:對於某些特定的業務,如果有順序要求,則需要進行特定的處理,因為notify()和notifyAll()方法就不能滿足要求,notify()會從等待隊列中隨機選擇一個線程進行喚醒,notifyAll()會喚醒整個等待隊列的線程。

⑷Balking模式:

需要執行某個方法或某個需求時,如果由於別的原因,不需要執行這個方法或者這個需求不需要了,就停止處理,或直接返回。

即某個線程發起一個請求,對於處理這個線程的請求,我們需要添加一個特定的處理,對於重復的處理,我們可以設定守護條件來阻止重復的執行,如果重復,則讓直接返回,或者結束線程。

⑸Producer-Consumer模式:

生產數據的線程和消費數據的線程有條不絮的合作進行,例如,當產量小於消費量,則消費者需要等待,當產量大於消費者,則生產必須停止生產,

⑹Read-Write Lock模式:

Java並發包中的java.util.concurrent.locks.ReentrantReadWriteLock類,可以做到鎖分離, 獲得讀鎖和寫鎖,當進行讀讀操作時,可以並行進行,當涉及寫操作時,則需要進行同步操作,在寫的時候,其他操作想要訪問臨界資源,就對其進行阻塞,需要先獲得對象的鎖,才可以訪問臨界資源。

Read-Write Lock模式,顯示的使用Lock類,對於鎖的使用,必須顯示的加鎖和釋放鎖,沒有synchronized關鍵字那樣,自動進行加鎖和釋放鎖,使用Lock類,可以做到讀寫鎖分離的模式,需要自己編寫讀寫鎖之間的邏輯,相當於Java並發包中的鎖分離的做到。

⑺Thrad-per-Message模式:

即每個消息一個線程,為每個命令或請求新分配一個線程,即將線程的任務處理交給別的線程進行執行。

請求者,即請求發出者向委托人發出請求,但是請求發出者不指導具體實如何處理請求的。

中間者:即將請求的處理,轉向執行者Helper,讓其處理請求,

執行者Helper,即請求實際是由Helper進行執行的。

適用於沒有順序要求,以及不需要返回值的,即request方法並不會等待handle方法執行結束,

⑻Worker Thread模式:

即工作線程執行操作,當沒有需要執行的操作時,工作線程進行等待,直到有需求,工作線程將繼續執行,這個模式也稱作線程池模式,線程池大家比較熟悉,就是為了減少線程之間創建,請求,釋放,提前在線程池中創建好線程,當有需要使用線程的時候,就從線程池中取,使用完畢,歸還給線程池,如果請求的線程大於線程池,則多餘的進行等待,直到有線程歸還。

⑼Future模式:

當有一個需要花費很長時間運行才可以獲取結果的操作時,可以讓線程等待,給予線程一個「訂單」即憑證,等一段時間,線程在拿著憑證來獲取運行結果,如果運行完成,則返回結果,沒有,則進行等待。

請求者:即請求者向Host發出請求,並會立即接受到請求的處理結果。

中介者:會創建新的線程,並開始在新線程中創建RealDate角色,同時將Future角色返回給請求者。

虛擬數據:

讓Future角色與RealData角色具有一致性的角色。即一個接口,Future和RealData都得繼承,然後Future包含RealData,可以調用線程,執行RealData的操作。

真實數據:

表示真實數據,創建該對象需要花費很多時間。

⑽Two-Phase Termination模式:

即分兩階段終止,是一種先執行終止處理在終止線程的模式,當線程在進行中,我們需要終止線程,我們會發送一個終止請求,線程不會突然終止,而是會先開始進行一些準備工作,這種狀態為終止處理中。

在終止處理中狀態下,線程不會在進行正常操作,但是它還是繼續運行,但只會進行終止處理,終止處理完成後,就會真正的終止線程。

和線程的中斷Interrupt()方法相似,當調用interrupt()方法的時候,線程會發送一個中斷請求,設置一個中斷標誌,線程並不會立即停止,線程是否真正中斷,我們不確定,但是如果想顯示的中斷操作,我們可以捕獲中斷標誌,進行線程的終止。中斷和這個模式相似,不同之處在於,此模式中,終止處理中,它執行的不是正常工作,而中斷執行則繼續執行原來的方法。

⑾Thread-Specific Storage模式:

即每個線程特有一個存儲櫃,為每個線程準備的存儲空間。這個模式的做到可以通過ThreadLocal類來做到。

⑾Active Object模式

Active Object是主動對象的意思,即有自己的線程,同時還可以從外部接受和處理異步消息並根據需要返回處理結果。

通過簡要的總結多線程設計模式,我們不需要去記住這些生硬的名稱,只需要聯想當有多個線程進行操作時,我們如何去協調這些線程,我們的某些方法其實就有設計模式的思想,知識的學習重點是理解和內化。

Java多線程設計模式概要

About 尋夢園
尋夢園是台灣最大的聊天室及交友社群網站。 致力於發展能夠讓會員們彼此互動、盡情分享自我的平台。 擁有數百間不同的聊天室 ,讓您隨時隨地都能找到志同道合的好友!