從本課開(kāi)始學(xué)習(xí)并發(fā)編程的內(nèi)容。主要介紹并發(fā)編程的基礎(chǔ)知識(shí)、鎖、內(nèi)存模型、線程池、各種并發(fā)容器的使用。
成都創(chuàng)新互聯(lián)自2013年起,先為陸豐等服務(wù)建站,陸豐等地企業(yè),進(jìn)行企業(yè)商務(wù)咨詢服務(wù)。為陸豐企業(yè)網(wǎng)站制作PC+手機(jī)+微官網(wǎng)三網(wǎng)同步一站式服務(wù)解決您的所有建站問(wèn)題。
并發(fā)編程
并發(fā)基礎(chǔ)
進(jìn)程
線程
線程通信
系統(tǒng)、包括操作系統(tǒng)的運(yùn)行是以CPU為核心的,各種數(shù)據(jù)操作都是在CPU中進(jìn)行的。所以要學(xué)習(xí)并發(fā)編程,必須要搞清楚和CPU的關(guān)系。
經(jīng)常說(shuō)CPU是4核8線程的,這個(gè)的意思是4個(gè)物理核心
,每個(gè)物理核心虛擬出2個(gè)虛擬核心,也就是8個(gè)虛擬核心
。每個(gè)虛擬核心在一個(gè)時(shí)刻只能運(yùn)行一個(gè)線程。
進(jìn)程的定義:程序被載入內(nèi)存并開(kāi)始準(zhǔn)備執(zhí)行,它就是一個(gè)進(jìn)程,也就是說(shuō)進(jìn)程是執(zhí)行中的程序代碼。進(jìn)程是資源分配和程序調(diào)度運(yùn)行的基本單位。
線程的定義:?jiǎn)蝹€(gè)進(jìn)程中執(zhí)行每個(gè)任務(wù)就是一個(gè)線程。線程是進(jìn)程中執(zhí)行運(yùn)算的最小單位。
一個(gè)線程只能屬于一個(gè)進(jìn)程,一個(gè)進(jìn)程可以擁有多個(gè)線程。多線程處理就是允許一個(gè)進(jìn)程中在同一時(shí)刻執(zhí)行多個(gè)任務(wù)(線程)。
對(duì)比 | 進(jìn)程 | 線程 |
---|---|---|
定義 | 進(jìn)程是程序?qū)嶓w的運(yùn)行過(guò)程,是系統(tǒng)資源分配和調(diào)度運(yùn)行的基本單位 | 線程是進(jìn)程執(zhí)行任務(wù)的最小調(diào)度單位 |
系統(tǒng)開(kāi)銷 | 創(chuàng)建切換開(kāi)銷大,資源要重新分配和回收 | 僅保存少量寄存器的內(nèi)容,開(kāi)銷小,并且在進(jìn)程的地址空間執(zhí)行代碼 |
占有資源 | 擁有分配的所有資源 | 基本不占資源,僅有其運(yùn)行不可少的資源(程序計(jì)數(shù)器、一組寄存器和棧) |
安全性 | 進(jìn)程間相互獨(dú)立 | 線程間共享進(jìn)程的資源,可以互相通信和影響 |
大多數(shù)的應(yīng)用程序?yàn)榱颂岣咂鋱?zhí)行效率,而采用多線程模式。充分利用CPU的核心來(lái)實(shí)現(xiàn)高效率運(yùn)行。那是不是最大只能同時(shí)開(kāi)啟8個(gè)線程呢?如果想開(kāi)啟更多線程,可以嗎?CPU內(nèi)部該如何處理呢?
對(duì)于4核8線程的CPU來(lái)說(shuō),如果只起8個(gè)線程,每個(gè)虛擬內(nèi)核都各自執(zhí)行一個(gè)線程,這是最簡(jiǎn)單的高效率利用方式。但是在實(shí)際使用時(shí)這是不可能的。首先,計(jì)算機(jī)硬件必須有操作才能運(yùn)行,而操作系統(tǒng)啟動(dòng)后在運(yùn)行過(guò)程中必不可少的要執(zhí)行各種任務(wù);其次,個(gè)人運(yùn)行的程序也是要啟動(dòng)線程來(lái)執(zhí)行各種各樣的任務(wù)調(diào)度。所以,對(duì)于一臺(tái)電腦,不管是個(gè)人PC還是服務(wù)器,其真正運(yùn)行的線程肯定是多于CPU的內(nèi)核數(shù)的,那它是如何保證各個(gè)任務(wù)流暢運(yùn)行的呢?
這就是CPU的線程調(diào)度。采用一定的算法把CPU的使用權(quán)合理的分配給線程,使得任務(wù)執(zhí)行。
有兩種調(diào)度模型,分時(shí)調(diào)度
和搶占式調(diào)度
。
分時(shí)調(diào)度模型是指讓所有的線程輪流獲得CPU的使用權(quán),并且平均分配每個(gè)線程占用的CPU時(shí)間片。
搶占式調(diào)度模型是指優(yōu)先讓運(yùn)行池中優(yōu)先級(jí)最高的線程占用CPU,如果優(yōu)先級(jí)相同,則隨機(jī)選擇一個(gè)線程來(lái)占用CPU。處于運(yùn)行中狀態(tài)的線程會(huì)一直運(yùn)行,直到它不得不放棄CPU。
JVM采用搶占式調(diào)度。
一個(gè)線程會(huì)因?yàn)橐韵略蚨艞塁PU:
串行:是指多個(gè)任務(wù),一個(gè)執(zhí)行完接著一個(gè)
并行:每個(gè)核心執(zhí)行一個(gè)任務(wù),同一時(shí)刻多個(gè)任務(wù)同時(shí)執(zhí)行
并發(fā):多個(gè)任務(wù)在單核心上執(zhí)行,同一時(shí)刻只有一個(gè)任務(wù),系統(tǒng)不停的切換任務(wù),看起來(lái)像是同時(shí)執(zhí)行,實(shí)際上是不停的切換
對(duì)于計(jì)算密集型任務(wù),線程數(shù)量不宜過(guò)多,因?yàn)楸旧砣蝿?wù)就是高CPU利用率,線程多的話,會(huì)因?yàn)樯舷挛那袚Q而浪費(fèi)資源。對(duì)于IO密集型任務(wù),比如磁盤IO和網(wǎng)絡(luò)IO,因?yàn)槿蝿?wù)是低CPU利用率,所以可以適當(dāng)多開(kāi)線程。