日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > java >内容正文

java

《Java 高并发》01 高并发基本概念

發(fā)布時間:2023/12/10 java 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 《Java 高并发》01 高并发基本概念 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

基本概念

同步和異步

同步和異步通常是用來形容一次方法調(diào)用。

同步方法調(diào)用一旦開始,調(diào)用者必須等到方法返回才能繼續(xù)執(zhí)行后續(xù)操作。

異步方法調(diào)用更像一個消息傳遞,一旦開始,方法調(diào)用就會立即返回,調(diào)用者就可以繼續(xù)后續(xù)的操作。異步方法通常會在另外一個線程中"真實"執(zhí)行,整個過程不會影響調(diào)用者的工作。

舉例:到了飯點,我們點外賣,下單成功之后等待外賣小哥送餐。這就是同步調(diào)用。 不過,為了學(xué)習(xí),我們在下單成功之后看了會《Java 從入門到放棄》書籍,邊等待外賣小哥送餐。這就是異步調(diào)用。

并發(fā)和并行

并發(fā)和并行兩個概念很容易被混淆。他們都可以表示兩個或者多個任務(wù)一起執(zhí)行,但是偏重點有些不同。并發(fā)偏重于多個任務(wù)交替執(zhí)行,而多個任務(wù)之間有可能還是串行的。而并行是真正意義上的"同時執(zhí)行"。

?

嚴(yán)格來說,并行的多個任務(wù)是真實的同時執(zhí)行,而對于并發(fā)來說,這個過程值是交替執(zhí)行。一會兒執(zhí)行A,一會兒執(zhí)行B,系統(tǒng)會不停地在兩者間切換。但是對于外部觀察者來說,即使多個任務(wù)之間是串行并發(fā)的,也會造成多任務(wù)間是并行執(zhí)行的錯覺。

舉例:三個人同時吃三個蘋果,這句是并行。而一個吃三個蘋果,這就是并發(fā),他需要來回切換。

臨界區(qū)

臨界區(qū)用來表示一種公共資源或者說是共享數(shù)據(jù),可以被多個線程使用。但是每一次,只能有一個線程使用它,一旦臨界區(qū)資源被占用,其他線程想要使用這個資源,則必須等待。

舉例:會議室開會,當(dāng)有人正在使用會議室,而這個時候你又想要使用這個會議室,就必須等他們會議結(jié)束才能使用。

阻塞和非阻塞

阻塞和非阻塞通常是用來形容多線程間的相互影響。比如當(dāng)臨界區(qū)資源被占用時,那么其他需要需要使用這個臨界區(qū)資源的線程就必須等待,等待會導(dǎo)致線程掛起,這種情況就是阻塞。非阻塞的意思與之相反,它強(qiáng)調(diào)沒有一個線程可以妨礙其他線程執(zhí)行。

死鎖、饑餓、和活鎖

死鎖、饑餓和活鎖都屬于多線程的活躍性問題。

死鎖:多個進(jìn)程對公共資源的相互競爭,導(dǎo)致循環(huán)等待的現(xiàn)象。比如:A->B->C->A,互相競爭,循環(huán)等待。

饑餓:指某一個線程或者多個線程因為某種原因無法獲得所需要的資源,導(dǎo)致一直無法執(zhí)行。比如:線程優(yōu)先級低,導(dǎo)致高優(yōu)先級的線程不斷搶占它需要的資源,導(dǎo)致低優(yōu)先級的線程無法工作。舉例:在自然界中,母鳥喂食。由于雛鳥很多,而食物有限,雛鳥之間的事務(wù)競爭可能非常厲害,小雛鳥因為經(jīng)常搶不到食物,有可能會被餓死。

活鎖:活鎖恰恰與死鎖相反,死鎖是大家都拿不到資源都占用著對方的資源,而活鎖是拿到資源卻又相互釋放不執(zhí)行。當(dāng)多線程中出現(xiàn)了相互謙讓,都主動將資源釋放給別的線程使用,這樣這個資源在多個線程之間跳動而又得不到執(zhí)行,這就是活鎖。舉例:兩個人迎面走來時,有時候因為有事比較急,而為了快速通過會避讓對方先行。恰好對方也為了能快速通過禮讓你先行,結(jié)果撞上了。于是乎,都意識到了這個問題,希望盡快避讓對方,你向右他向左,結(jié)果又撞上了。

并發(fā)級別

由于臨界區(qū)的存在,多線程之間的并發(fā)必須收到控制。根據(jù)控制并發(fā)的策略對并發(fā)的級別進(jìn)行分類,大致為阻塞無饑餓無障礙無鎖無等待

阻塞

一個線程是阻塞的,那么在其他線程釋放資源之前,當(dāng)前線程無法繼續(xù)執(zhí)行。當(dāng)使用 Synchronized 關(guān)鍵字或者重入鎖時,我們得到的就是阻塞線程。

無饑餓

如果線程之間是有優(yōu)先級的,那么線程調(diào)度的時候總是會傾向于滿足高優(yōu)先級的線程。也就是說,對于同一個資源的分配,是不公平的。那就出現(xiàn)了公平和非公平兩種情況。對于非公平鎖來說,系統(tǒng)允許優(yōu)先級高的線程插隊。這樣有可能導(dǎo)致優(yōu)先級低的線程產(chǎn)生饑餓。但如果鎖是公平的,滿足先來后到,那么接就不會產(chǎn)生,不論新來的線程優(yōu)先級高低,想要獲得資源就必須乖乖排隊,那么所有的線程都有機(jī)會執(zhí)行。

無障礙

無障礙是一種最弱的非阻塞調(diào)度。兩個線程如果是無障礙的執(zhí)行,那么他們不會因為臨界區(qū)的問題導(dǎo)致一方被掛起。換言之,大家都可以大搖大擺地進(jìn)入臨界區(qū)了。對于無障礙的線程來說,一旦檢測到數(shù)據(jù)被修改壞了,它會立即對自己所做的修改進(jìn)行回滾,確保數(shù)據(jù)的安全。

如果說阻塞的控制方式是悲觀策略,那么非阻塞的調(diào)度就是一種樂觀的策略。它任務(wù)多個線程之間很有可能不會發(fā)生沖突,或者說這種概率不大。因此大家都應(yīng)該無障礙的執(zhí)行,但是一旦檢測到?jīng)_突,就應(yīng)該進(jìn)行回滾。但是無障礙的多線程程序并不一定能夠順暢的運(yùn)行,因為當(dāng)臨界區(qū)中存在嚴(yán)重的沖突時,所有的線程可能都會不斷地回滾自己的操作,而沒有一個線程可以走出臨界區(qū)。這種情況會影響系統(tǒng)的正常執(zhí)行。所有,我們希望在這一堆線程中,至少有一個線程能夠在有效的時間內(nèi)完成自己的操作,從而退出臨界區(qū)。至少這樣可以保證系統(tǒng)不會在臨界區(qū)中進(jìn)行無線的等待。

一種可行的無障礙實現(xiàn)可以依賴一個"一致性標(biāo)記"來實現(xiàn)。線程在操作之前,線程讀取并保存這個標(biāo)記,在操作完成后,在此讀取,檢查這個標(biāo)記是否被更改過,如果兩者是一致的,則的說明資源訪問沒有沖突。如果不一致,則說明資源可能在操作過程中與其他線程沖突,需要重試操作。

無鎖

無鎖的并行都是無障礙的。在無鎖的情況下,所有的線程都能嘗試對臨界區(qū)進(jìn)行訪問,但是不同的是,無鎖的并發(fā)保證必然有一個線程能夠在有限步內(nèi)完成操作離開臨界區(qū)。

無等待

無鎖只要求有一個線程可以在有限步內(nèi)完成操作,而無等待則是在無鎖的基礎(chǔ)上更進(jìn)一步進(jìn)行擴(kuò)展。它要求所有的線程都必須在有限步內(nèi)完成,這樣就不會引起饑餓問題。如果限制這個步驟上限,還可以進(jìn)一步分解為有界無等待和線程數(shù)無關(guān)的無等待幾種,他們之間的區(qū)別只是對循環(huán)次數(shù)的限制不同。

創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎勵來咯,堅持創(chuàng)作打卡瓜分現(xiàn)金大獎

總結(jié)

以上是生活随笔為你收集整理的《Java 高并发》01 高并发基本概念的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。