编程体系结构(05):Java多线程并发
本文源碼:GitHub·點(diǎn)這里 || GitEE·點(diǎn)這里
一、多線程導(dǎo)圖
二、多線程基礎(chǔ)
1、基礎(chǔ)概念
線程是操作系統(tǒng)能夠進(jìn)行運(yùn)算調(diào)度的最小單位,包含在進(jìn)程之中,是進(jìn)程中的實際運(yùn)作單位。一條線程指的是進(jìn)程中一個單一順序的控制流,一個進(jìn)程中可以并發(fā)多個線程,每條線程并行執(zhí)行不同的任務(wù)。
2、創(chuàng)建方式
繼承Thread類、實現(xiàn)Runnable接口、基于Callable和Future接口、Timer是后臺線程、線程池。
3、線程狀態(tài)
狀態(tài)描述:初始狀態(tài)、運(yùn)行狀態(tài)、阻塞狀態(tài)、等待狀態(tài)、超時等待狀態(tài)、終止?fàn)顟B(tài)。
4、執(zhí)行機(jī)制
JVM中一個應(yīng)用是可以有多個線程并行執(zhí)行,線程被一對一映射為服務(wù)所在操作系統(tǒng)線程,調(diào)度在可用的CPU上執(zhí)行,啟動時會創(chuàng)建一個操作系統(tǒng)線程;當(dāng)該線程終止時,這個操作系統(tǒng)線程也會被回收。
5、內(nèi)存模型
在虛擬機(jī)啟動運(yùn)行時,會創(chuàng)建多個線程,數(shù)據(jù)區(qū)中有的模塊是線程共享的,有的是線程私有的:
線程共享:元數(shù)據(jù)區(qū)、堆Heap;
線程私有:虛擬機(jī)棧、本地方法棧、程序計數(shù)器;
單個CPU在特定時刻只能執(zhí)行一個線程,所以多線程通過幾塊空間的使用,然后不斷的爭搶CPU的執(zhí)行時間段。
三、常見概念
1、線程優(yōu)先級
線程調(diào)度器傾向執(zhí)行線程優(yōu)先級高的線程,線程優(yōu)先級高說明獲取CPU資源的概率高,或者獲取的執(zhí)行時間分片多,被執(zhí)行的概率高但不代表優(yōu)先級低的一定最后執(zhí)行。
2、守護(hù)線程
守護(hù)線程是支持輔助型線程,主要在程序中起到調(diào)度和支持性作用,當(dāng)Jvm中非守護(hù)線程全部結(jié)束,守護(hù)線程也就會結(jié)束。
3、線程加入
線程A中,執(zhí)行線程B的加入方法,那么A線程就會等待線程B執(zhí)行完畢再返回繼續(xù)執(zhí)行。
4、本地線程
ThreadLocal也叫做線程本地變量,為變量在每個線程中的創(chuàng)建副本,每個線程可以訪問自己內(nèi)部的副本變量,線程之間互不相互影響。
四、線程安全
在上圖線程與內(nèi)存空間的占用方式看,在線程訪問共享內(nèi)存塊時,保證線程安全就很有必要。
1、同步控制
Synchronized關(guān)鍵字同步控制,可以修飾方法,修飾代碼塊,修飾靜態(tài)方法等,同步控制的資源少,可以提高多線程效率。
2、加鎖機(jī)制
Lock接口:Java并發(fā)編程中資源加鎖的根接口之一,規(guī)定了資源鎖使用的幾個基礎(chǔ)方法。
ReentrantLock類:實現(xiàn)Lock接口的可重入鎖,即線程如果獲得當(dāng)前實例的鎖,并進(jìn)入任務(wù)方法,在線程沒有釋放鎖的狀態(tài)下,可以再次進(jìn)入任務(wù)方法,特點(diǎn):互斥排它性,即同一個時刻只有一個線程進(jìn)入任務(wù)。
Condition接口:描述可能會與鎖有關(guān)聯(lián)的條件變量,提供了更強(qiáng)大的功能,例如在線程的等待/通知機(jī)制上,Conditon可以實現(xiàn)多路通知和選擇性通知。
3、Volatile關(guān)鍵字
volatile修飾成員變量,不能修飾方法,即標(biāo)識該線程在訪問這個變量時需要從共享內(nèi)存中獲取,對該變量的修改,也需要同步刷新到共享內(nèi)存中,保證了變量對所有線程的可見性。
五、線程通信
線程是個獨(dú)立的個體,但是在線程執(zhí)行過程中,如果處理同一個業(yè)務(wù)邏輯,可能會產(chǎn)生資源爭搶,導(dǎo)致并發(fā)問題,甚至死鎖現(xiàn)象,線程之間協(xié)調(diào)工作,就需要通信機(jī)制來保障。
1、基礎(chǔ)方法
相關(guān)方法是Java中Object層級的基礎(chǔ)方法,任何對象都有該方法:notify()隨機(jī)通知一個在該對象上等待的線程,使其結(jié)束wait狀態(tài)返回;wait()線程進(jìn)入waiting等待狀態(tài),不會爭搶鎖對象,也可以設(shè)置等待時間;
2、等待/通知機(jī)制
等待/通知機(jī)制,該模式下指線程A在不滿足任務(wù)執(zhí)行的情況下調(diào)用對象wait()方法進(jìn)入等待狀態(tài),線程B修改了線程A的執(zhí)行條件,并調(diào)用對象notify()或者notifyAll()方法,線程A收到通知后從wait狀態(tài)返回,進(jìn)而執(zhí)行后續(xù)操作。兩個線程通過基于對象提供的wait()/notify()/notifyAll()等方法完成等待和通知間交互,提高程序的可伸縮性。
3、管道流通信
管道流主要用于在不同線程間直接傳送數(shù)據(jù),一個線程發(fā)送數(shù)據(jù)到輸出管道,另一個線程從輸入管道中讀取數(shù)據(jù),進(jìn)而實現(xiàn)不同線程間的通信。
六、線程池
1、Executor接口
Executor系統(tǒng)中,將線程任務(wù)提交和任務(wù)執(zhí)行進(jìn)行了解耦的設(shè)計,Executor有各種功能強(qiáng)大的實現(xiàn)類,提供便捷方式來提交任務(wù)并且獲取任務(wù)執(zhí)行結(jié)果,封裝了任務(wù)執(zhí)行的過程,不再需要Thread().start()方式,顯式創(chuàng)建線程并關(guān)聯(lián)執(zhí)行任務(wù)。
2、核心參數(shù)
3、相關(guān)API類
線程池任務(wù):核心接口:Runnable、Callable接口和接口實現(xiàn)類;
任務(wù)的結(jié)果:接口Future和實現(xiàn)類FutureTask;
任務(wù)的執(zhí)行:核心接口Executor和ExecutorService接口。在Executor框架中有兩個核心類實現(xiàn)了ExecutorService接口,ThreadPoolExecutor和ScheduledThreadPoolExecutor。
七、常用線程API
1、Fork/Join機(jī)制
Fork/Join框架用于并行執(zhí)行任務(wù),核心的思想就是將一個大任務(wù)切分成多個小任務(wù),然后匯總每個小任務(wù)的執(zhí)行結(jié)果得到這個大任務(wù)的最終結(jié)果。核心流程:切分任務(wù),模塊任務(wù)異步執(zhí)行,單任務(wù)結(jié)果合并。
2、容器類
ConcurrentHashMap:使用分段鎖機(jī)制,把容器中數(shù)據(jù)分成一段一段的方式存儲,然后給每一段數(shù)據(jù)配一把鎖,當(dāng)一個線程占用鎖訪問其中一個段數(shù)據(jù)的時候,其他段的數(shù)據(jù)也能被其他線程訪問,即考慮安全性也顧及執(zhí)行效率。
ConcurrentLinkedQueue:基于鏈接節(jié)點(diǎn)的無界線程安全隊列,按照FIFO先進(jìn)先出原則對元素進(jìn)行排序,隊列的頭部 是隊列中時間最長的元素,隊列的尾部是隊列中時間最短的元素,新的元素添加到隊列的尾部,獲取元素操作從隊列頭部得到。
3、原子類
JDK自帶原子操作類,處理多個線程同時操作一個變量的情況,其中包括:基本類型、數(shù)組類型、引用類型、屬性修改類型。
八、應(yīng)用場景
1、定時任務(wù)
通過配置設(shè)置一些程序在指定時間點(diǎn),或者周期時間內(nèi)規(guī)律循環(huán)執(zhí)行,這里任務(wù)的執(zhí)行就是基于多線程技術(shù)。
2、異步處理
異步處理就是不按照當(dāng)前同步代碼塊程序執(zhí)行,異步處理與同步處理是對立的,異步的實現(xiàn)也需要多線程或者多進(jìn)程,提高程序效率。
3、任務(wù)分解
分布式數(shù)據(jù)庫中常見操作,數(shù)據(jù)分布在不同的數(shù)據(jù)庫的副本中,在執(zhí)行查詢時,每個服務(wù)都要跑查詢?nèi)蝿?wù),最后在一個服務(wù)上做數(shù)據(jù)合并,或者提供一個中間引擎層,用來匯總數(shù)據(jù),在大型的定時任務(wù)中,經(jīng)常把要處理的任務(wù)按照特定策略分片,多個線程同時處理。
4、連接池技術(shù)
創(chuàng)建和管理一個連接的緩沖池的技術(shù),這些連接準(zhǔn)備好被任何需要它們的線程使用,減少連接不斷創(chuàng)建和釋放的問題,提高程序效率。
九、源代碼地址
GitHub·地址 https://github.com/cicadasmile GitEE·地址 https://gitee.com/cicadasmile推薦閱讀:編程體系整理
| 01 | Java描述設(shè)計模式,算法,數(shù)據(jù)結(jié)構(gòu) | GitHub·點(diǎn)這里 | GitEE·點(diǎn)這里 | ☆☆☆☆☆ |
| 02 | Java基礎(chǔ)、并發(fā)、面向?qū)ο蟆eb開發(fā) | GitHub·點(diǎn)這里 | GitEE·點(diǎn)這里 | ☆☆☆☆ |
| 03 | SpringCloud微服務(wù)基礎(chǔ)組件案例詳解 | GitHub·點(diǎn)這里 | GitEE·點(diǎn)這里 | ☆☆☆ |
| 04 | SpringCloud微服務(wù)架構(gòu)實戰(zhàn)綜合案例 | GitHub·點(diǎn)這里 | GitEE·點(diǎn)這里 | ☆☆☆☆☆ |
| 05 | SpringBoot框架基礎(chǔ)應(yīng)用入門到進(jìn)階 | GitHub·點(diǎn)這里 | GitEE·點(diǎn)這里 | ☆☆☆☆ |
| 06 | SpringBoot框架整合開發(fā)常用中間件 | GitHub·點(diǎn)這里 | GitEE·點(diǎn)這里 | ☆☆☆☆☆ |
| 07 | 數(shù)據(jù)管理、分布式、架構(gòu)設(shè)計基礎(chǔ)案例 | GitHub·點(diǎn)這里 | GitEE·點(diǎn)這里 | ☆☆☆☆☆ |
| 08 | 大數(shù)據(jù)系列、存儲、組件、計算等框架 | GitHub·點(diǎn)這里 | GitEE·點(diǎn)這里 | ☆☆☆☆☆ |
總結(jié)
以上是生活随笔為你收集整理的编程体系结构(05):Java多线程并发的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C#提取HTML代码中的文字(转)
- 下一篇: Flash常用快捷键大全 (hotkey