溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

java中的并發(fā)是什么

發(fā)布時間:2020-06-10 19:20:22 來源:億速云 閱讀:270 作者:鴿子 欄目:編程語言

并發(fā)是什么?

并發(fā):是指在某個時間段內(nèi),多任務(wù)交替的執(zhí)行任務(wù)。當有多個線程在操作時,把CPU運行時間劃分成若干個時間段,再將時間段分配給各個線程執(zhí)行。 在一個時間段的線程代碼運行時,其它線程處于掛起狀。

在并發(fā)環(huán)境下,程序的封閉性被打破,出現(xiàn)以下特點:

● 并發(fā)程序之間有相互制約的關(guān)系。直接制約體現(xiàn)為一個程序需要另一個程序的計算結(jié)果;間接體現(xiàn)為多個程序競爭共享資源,如處理器、緩沖區(qū)等。

● 并發(fā)程序的執(zhí)行過程是斷斷續(xù)續(xù)的。程序需要記憶現(xiàn)場指令及執(zhí)行點。

● 當并發(fā)數(shù)設(shè)置合理并且CPU擁有足夠的處理能力時,并發(fā)會提高程序的運行效率。

在并發(fā)環(huán)境中,當一個對象可以被多個線程訪問到時,會造成該對象可以被任何訪問到的線程進行修改,從而出現(xiàn)數(shù)據(jù)不一致的情況。所以提出線程安全的概念。

并發(fā)和并行

是十分容易混淆的概念。并發(fā)指的是多個任務(wù)交替進行,而并行則是指真正意義上的“同時進行”。實際上,如果系統(tǒng)內(nèi)只有一個CPU,使用多線程時,在真實系統(tǒng)環(huán)境下不能并行,只能通過切換時間片的方式交替進行,從而并發(fā)執(zhí)行任務(wù)。真正的并行只能出現(xiàn)在擁有多個CPU的系統(tǒng)中。


為什么要用到并發(fā)?

并發(fā)編程在一定程度上離不開多核CPU的發(fā)展。隨著單核CPU的研發(fā)已經(jīng)不能遵循“摩爾定律”(摩爾定律是硬件發(fā)展的觀測定律,另外還有基于“摩爾定律”的“反摩爾定律”,不過“反摩爾定律”是軟件領(lǐng)域的定律,有興趣的可以自行了解),硬件工程師們?yōu)榱诉M一步提升計算速度,而不是再追求單獨的計算單元,而是將多個計算單元整合到了一起,也就是形成了多核CPU。短短十幾年的時間,家用型CPU,比如Intel i7就可以達到4核心甚至8核心。而專業(yè)服務(wù)器則通??梢赃_到幾個獨立的CPU,每一個CPU甚至擁有多達8個以上的內(nèi)核。

因此,“摩爾定律”似乎在CPU核心擴展上繼續(xù)得到體驗。而在多核的CPU的背景下,催生了并發(fā)編程的趨勢,通并發(fā)編程的形式可以將多核CPU的計算能力發(fā)揮到極致,性能得到提升。

在特殊的業(yè)務(wù)場景下先天的就適合于并發(fā)編程。比如在圖像處理領(lǐng)域,一張1024X768像素的圖片,包含達到78萬6千多個像素。即時將所有的像素遍歷一邊都需要很長的時間,面對如此復(fù)雜的計算量就需要充分利用多核的計算的能力。

另外在開發(fā)購物平臺時,為了提升響應(yīng)速度,需要拆分,減庫存,生成訂單等等這些操作,就可以進行拆分利用多線程的技術(shù)完成。面對復(fù)雜業(yè)務(wù)模型,并行程序會比串行程序更適應(yīng)業(yè)務(wù)需求,而并發(fā)編程吻合更能這種業(yè)務(wù)拆分正是因為這些優(yōu)點,使得多線程技術(shù)能夠得到重視,也是一名CS學習者應(yīng)該掌握的:

● 充分利用多核CPU的計算能力;

● 方便進行業(yè)務(wù)拆分,提升應(yīng)用性能

并發(fā)編程有哪些缺點?

1、頻繁的上下文切換

時間片是CPU分配給各個線程的時間,因為時間非常短,所以CPU不斷通過切換線程,讓我們覺得多個線程是同時執(zhí)行的,時間片一般是幾十毫秒。

每次切換時,需要把當前的狀態(tài)保存起來,以便能夠進行恢復(fù)先前狀態(tài),而這個切換行為非常損耗性能,過于頻繁切換反而無法發(fā)揮出多線程編程的優(yōu)勢。通常減少上下文切換可以采用無鎖并發(fā)編程、 CAS算法、使用最少的線程和使用協(xié)程。

無鎖并發(fā)編程:可以參照的ConcurrentHashMap鎖分段的思想,不同的線程處理不同段的數(shù)據(jù),這樣在多線程競爭的條件下,可以減少上下文切換的時間。

CAS算法,利用原子下使用CAS算法來更新數(shù)據(jù),使用了樂觀鎖,可以有效的減少一部分不必要的鎖競爭帶來的上下文切換

使用最少線程:避免創(chuàng)建不需要的線程,比如任務(wù)很少,但是創(chuàng)建了很多的線程,這樣會造成大量的線程都處于等待狀態(tài)

協(xié)程:在單線程里實現(xiàn)多任務(wù)的調(diào)度,并在單線程里維持多個任務(wù)間的切換

由于上下文切換是個相對比較耗時的操作,所以在 “Java的并發(fā)編程的藝術(shù)” 一書中有過一個實驗,并發(fā)累加未必會比串行累加速度快。

2、線程的安全性問題

多線程編程中最難以把握的就是臨界區(qū)線程安全問題,稍微不注意就會出現(xiàn)死鎖的情況,一旦產(chǎn)生死鎖就會造成系統(tǒng)功能不可用。

以上就是java并發(fā)是什么?的詳細內(nèi)容,更多請關(guān)注億速云其它相關(guān)文章!

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI