編程基礎(chǔ)教程,Java并發(fā)編程入門(mén)

編程基礎(chǔ)教程,Java并發(fā)編程入門(mén)

深圳達(dá)內(nèi)教育      2022-04-28 20:14:01     3

編程基礎(chǔ)教程,Java并發(fā)編程入門(mén),基礎(chǔ)概念進(jìn)程:進(jìn)程是程序運(yùn)行資源(包括CPU,內(nèi)存、IO等)分配的最小單位,有自己的獨(dú)立地址空間,是一個(gè)具有一定獨(dú)立功能的程

課程價(jià)格 請(qǐng)咨詢(xún)

上課時(shí)段: 授課校區(qū):

詳細(xì)介紹

基礎(chǔ)概念

進(jìn)程:進(jìn)程是程序運(yùn)行資源(包括CPU,內(nèi)存、IO等)分配的最小單位,有自己的獨(dú)立地址空間,是一個(gè)具有一定獨(dú)立功能的程序在操作系統(tǒng)中的一次執(zhí)行過(guò)程。同一進(jìn)程中的多個(gè)線程共享該進(jìn)程中的全部系統(tǒng)資源,而進(jìn)程和進(jìn)程之間是相互獨(dú)立的。

線程:線程是程序執(zhí)行的最小單位,是CPU調(diào)度和分派的基本單位,線程本身基本上不擁有系統(tǒng)資源,只擁有一點(diǎn)在運(yùn)行中必不可少的資源(如程序計(jì)數(shù)器,寄存器和棧),線程必須依賴(lài)于進(jìn)程而存在。

CPU時(shí)間片輪轉(zhuǎn)調(diào)度:百度百科解釋?zhuān)瑫r(shí)間片輪轉(zhuǎn)調(diào)度是一種最古老,最簡(jiǎn)單,最公平且使用最廣的算法。每個(gè)進(jìn)程被分配一個(gè)時(shí)間段,稱(chēng)作它的時(shí)間片,即該進(jìn)程允許運(yùn)行的時(shí)間。如果在時(shí)間片結(jié)束時(shí)進(jìn)程還在運(yùn)行,則CPU將被剝奪并分配給另一個(gè)進(jìn)程。如果進(jìn)程在時(shí)間片結(jié)束前阻塞或結(jié)束,則CPU當(dāng)即進(jìn)行切換。調(diào)度程序所要做的就是維護(hù)一張就緒進(jìn)程列表,當(dāng)進(jìn)程用完它的時(shí)間片后,它被移到隊(duì)列的末尾。

時(shí)間片輪轉(zhuǎn)調(diào)度中唯一有趣的一點(diǎn)是時(shí)間片的長(zhǎng)度。從一個(gè)進(jìn)程切換到另一個(gè)進(jìn)程是需要一定時(shí)間的--保存和裝入寄存器值及內(nèi)存映像,更新各種表格和隊(duì)列等。假如進(jìn)程切換(process switch)-有時(shí)稱(chēng)為上下文切換(context switch),需要5毫秒,再假設(shè)時(shí)間片設(shè)為20毫秒,則在做完20毫秒有用的工作之后,CPU將花費(fèi)5毫秒來(lái)進(jìn)行進(jìn)程切換。CPU時(shí)間的20%被浪費(fèi)在了管理開(kāi)銷(xiāo)上。

為了提高CPU效率,我們可以將時(shí)間片設(shè)為500毫秒。這時(shí)浪費(fèi)的時(shí)間只有1%。但考慮在一個(gè)分時(shí)系統(tǒng)中,如果有十個(gè)交互用戶(hù)幾乎同時(shí)按下回車(chē)鍵,將發(fā)生什么情況?假設(shè)所有其他進(jìn)程都用足它們的時(shí)間片的話,最后一個(gè)不幸的進(jìn)程不得不等待5秒鐘才獲得運(yùn)行機(jī)會(huì)。多數(shù)用戶(hù)無(wú)法忍受一條簡(jiǎn)短命令要5秒鐘才能做出響應(yīng)。同樣的問(wèn)題在一臺(tái)支持多道程序的個(gè)人計(jì)算機(jī)上也會(huì)發(fā)生。

結(jié)論可以歸結(jié)如下:時(shí)間片設(shè)得太短會(huì)導(dǎo)致過(guò)多的進(jìn)程切換,降低了CPU效率;而設(shè)得太長(zhǎng)又可能引起對(duì)短的交互請(qǐng)求的響應(yīng)變差。將時(shí)間片設(shè)為100毫秒通常是一個(gè)比較合理的折中。

并發(fā):假如一個(gè)CPU只能分配給一個(gè)進(jìn)程,并發(fā)就是指在同一時(shí)刻只能有一條指令執(zhí)行,但多個(gè)進(jìn)程指令被快速的輪換執(zhí)行,使得在宏觀上具有多個(gè)進(jìn)程同時(shí)執(zhí)行的效果,但在微觀上并不是同時(shí)執(zhí)行的,只是把時(shí)間分成若干段,使多個(gè)進(jìn)程快速交替的執(zhí)行。

并行:并行是指在同一時(shí)刻,有多條指令在多個(gè)處理器上同時(shí)執(zhí)行。所以無(wú)論從微觀還是從宏觀來(lái)看,二者都是一起執(zhí)行的。舉個(gè)例子:銀行柜臺(tái)辦理業(yè)務(wù),假如只有3個(gè)窗口,那么同一時(shí)刻辦理業(yè)務(wù)時(shí)最多允許的并行人數(shù)就為3,其他人就必須的排隊(duì)等候,假設(shè)每一個(gè)窗口10分鐘能辦理一個(gè)人,那么可以認(rèn)為該銀行每10分鐘能并發(fā)處理3個(gè)人。

并發(fā)編程的優(yōu)勢(shì):由于多核多線程的CPU的誕生,多線程、高并發(fā)的編程已經(jīng)成為程序員的必備技能。并發(fā)編程的好處,首先,最直接的體現(xiàn)就是縮短了用戶(hù)的響應(yīng)時(shí)間,比如自己系統(tǒng)要同時(shí)調(diào)用A,B,C三個(gè)系統(tǒng),數(shù)據(jù)之間沒(méi)有依賴(lài),用單線程的方式如下:

多線程調(diào)用方式如下:

其次,并發(fā)編程更加充分的利用了CPU的資源,減少了CPU的空閑時(shí)間,發(fā)揮它的運(yùn)算能力,比如一個(gè)4核8線程的CPU,如果只有一個(gè)單線程程序在運(yùn)行,那么意味著有7/8的CPU性能被浪費(fèi);最后,可以使代碼模塊化,異步化,避免因?yàn)槟硞€(gè)環(huán)節(jié)阻塞導(dǎo)致整個(gè)程序阻塞。

并發(fā)編程注意事項(xiàng):

(1)線程之間的安全性,在同一個(gè)進(jìn)程里面的多線程是資源共享的,對(duì)共享變量的讀寫(xiě),一般都需要考慮線程同步,否則可能影響線程安全;

(2)線程之間的死鎖,所謂死鎖是指兩個(gè)或兩個(gè)以上的線程在執(zhí)行過(guò)程中,因爭(zhēng)奪資源而造成的一種互相等待的現(xiàn)象,若無(wú)外力作用,它們都將無(wú)法推進(jìn)下去。比如有一個(gè)保險(xiǎn)柜和一把鑰匙,甲,乙分別獲得保險(xiǎn)柜和鑰匙,這時(shí)候甲要打開(kāi)保險(xiǎn)柜就要乙的鑰匙,乙要打開(kāi)保險(xiǎn)柜就要甲的保險(xiǎn)柜,2人互相不信任,保險(xiǎn)柜就沒(méi)法打開(kāi),阻塞住了;

(3)線程數(shù)太多有可能造成系統(tǒng)創(chuàng)建大量線程而導(dǎo)致消耗完系統(tǒng)內(nèi)存以及CPU的“過(guò)渡切換”,造成系統(tǒng)的死機(jī)。

以上就是深圳達(dá)內(nèi)教育java培訓(xùn)機(jī)構(gòu)的小編針對(duì)“編程基礎(chǔ)教程,Java并發(fā)編程入門(mén)”的內(nèi)容進(jìn)行的回答,希望對(duì)大家有所幫助,如有疑問(wèn),請(qǐng)?jiān)诰€咨詢(xún),有專(zhuān)業(yè)老師隨時(shí)為你服務(wù)。

培訓(xùn)啦提醒您:交易時(shí)請(qǐng)核實(shí)對(duì)方資質(zhì),對(duì)于過(guò)大宣傳或承諾需謹(jǐn)慎!任何要求預(yù)付定金、匯款等方式均存在風(fēng)險(xiǎn),謹(jǐn)防上當(dāng)。