欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

java高并發(fā)的并發(fā)級(jí)別詳解

 更新時(shí)間:2021年10月26日 15:55:41   作者:路人甲Java  
這篇文章主要介紹了java高并發(fā)的并發(fā)級(jí)別,內(nèi)容十分豐富,在這里分享給大家,需要的朋友可以參考,希望能夠給你帶來(lái)幫助

阻塞、無(wú)饑餓、無(wú)障礙、無(wú)鎖、無(wú)等待幾種。

阻塞

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

synchronize關(guān)鍵字和重入鎖都試圖在執(zhí)行后續(xù)代碼前,得到臨界區(qū)的鎖,如果得不到,線(xiàn)程就會(huì)被掛起等待,直到占有了所需資源為止。

無(wú)饑餓(Starvation-Free)

如果線(xiàn)程之間是有優(yōu)先級(jí)的,那么線(xiàn)程調(diào)度的時(shí)候總是會(huì)傾向于先滿(mǎn)足高優(yōu)先級(jí)的線(xiàn)程。也就是說(shuō),對(duì)于同一個(gè)資源的分配,是不公平的!圖1.7中顯示了非公平鎖與公平鎖兩種情況(五角星表示高優(yōu)先級(jí)線(xiàn)程)。對(duì)于非公平鎖來(lái)說(shuō),系統(tǒng)允許高優(yōu)先級(jí)的線(xiàn)程插隊(duì)。這樣有可能導(dǎo)致低優(yōu)先級(jí)線(xiàn)程產(chǎn)生饑餓。但如果鎖是公平的,按照先來(lái)后到的規(guī)則,那么饑餓就不會(huì)產(chǎn)生,不管新來(lái)的線(xiàn)程優(yōu)先級(jí)多高,要想獲得資源,就必須乖乖排隊(duì),這樣所有的線(xiàn)程都有機(jī)會(huì)執(zhí)行。

640?wx_fmt=png

無(wú)障礙(Obstruction-Free)

無(wú)障礙是一種最弱的非阻塞調(diào)度。兩個(gè)線(xiàn)程如果無(wú)障礙地執(zhí)行,那么不會(huì)因?yàn)榕R界區(qū)的問(wèn)題導(dǎo)致一方被掛起。換言之,大家都可以大搖大擺地進(jìn)入臨界區(qū)了。那么大家一起修改共享數(shù)據(jù),把數(shù)據(jù)改壞了怎么辦呢?對(duì)于無(wú)障礙的線(xiàn)程來(lái)說(shuō),一旦檢測(cè)到這種情況,它就會(huì)立即對(duì)自己所做的修改進(jìn)行回滾,確保數(shù)據(jù)安全。但如果沒(méi)有數(shù)據(jù)競(jìng)爭(zhēng)發(fā)生,那么線(xiàn)程就可以順利完成自己的工作,走出臨界區(qū)。

如果說(shuō)阻塞的控制方式是悲觀(guān)策略,也就是說(shuō),系統(tǒng)認(rèn)為兩個(gè)線(xiàn)程之間很有可能發(fā)生不幸的沖突,因此以保護(hù)共享數(shù)據(jù)為第一優(yōu)先級(jí),相對(duì)來(lái)說(shuō),非阻塞的調(diào)度就是一種樂(lè)觀(guān)的策略。它認(rèn)為多個(gè)線(xiàn)程之間很有可能不會(huì)發(fā)生沖突,或者說(shuō)這種概率不大。因此大家都應(yīng)該無(wú)障礙地執(zhí)行,但是一旦檢測(cè)到?jīng)_突,就應(yīng)該進(jìn)行回滾。

從這個(gè)策略中也可以看到,無(wú)障礙的多線(xiàn)程程序并不一定能順暢運(yùn)行。因?yàn)楫?dāng)臨界區(qū)中存在嚴(yán)重的沖突時(shí),所有的線(xiàn)程可能都會(huì)不斷地回滾自己的操作,而沒(méi)有一個(gè)線(xiàn)程可以走出臨界區(qū)。這種情況會(huì)影響系統(tǒng)的正常執(zhí)行。所以,我們可能會(huì)非常希望在這一堆線(xiàn)程中,至少可以有一個(gè)線(xiàn)程能夠在有限的時(shí)間內(nèi)完成自己的操作,而退出臨界區(qū)。至少這樣可以保證系統(tǒng)不會(huì)在臨界區(qū)中進(jìn)行無(wú)限的等待。

一種可行的無(wú)障礙實(shí)現(xiàn)可以依賴(lài)一個(gè)"一致性標(biāo)記"來(lái)實(shí)現(xiàn)。線(xiàn)程在操作之前,先讀取并保存這個(gè)標(biāo)記,在操作完成后,再次讀取,檢查這個(gè)標(biāo)記是否被更改過(guò),如果兩者是一致的,則說(shuō)明資源訪(fǎng)問(wèn)沒(méi)有沖突。如果不一致,則說(shuō)明資源可能在操作過(guò)程中與其他線(xiàn)程沖突,需要重試操作。而任何對(duì)資源有修改操作的線(xiàn)程,在修改數(shù)據(jù)前,都需要更新這個(gè)一致性標(biāo)記,表示數(shù)據(jù)不再安全。

數(shù)據(jù)庫(kù)中樂(lè)觀(guān)鎖,應(yīng)該比較熟悉,表中需要一個(gè)字段version(版本號(hào)),每次更新數(shù)據(jù)version+1,更新的時(shí)候?qū)姹咎?hào)作為條件進(jìn)行更新,根據(jù)更新影響的行數(shù)判斷更新是否成功,偽代碼如下:

1.查詢(xún)數(shù)據(jù),此時(shí)版本號(hào)為w_v	
2.打開(kāi)事務(wù)	
3.做一些業(yè)務(wù)操作	
4.update t set version = version+1 where id = 記錄id and version = w_v;//此行會(huì)返回影響的行數(shù)c	
5.if(c>0){	
        //提交事務(wù)	
    }else{	
        //回滾事務(wù)	
    }

多個(gè)線(xiàn)程更新同一條數(shù)據(jù)的時(shí)候,數(shù)據(jù)庫(kù)會(huì)對(duì)當(dāng)前數(shù)據(jù)加鎖,同一時(shí)刻只有一個(gè)線(xiàn)程可以執(zhí)行更新語(yǔ)句。

無(wú)鎖(Lock-Free)

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

在無(wú)鎖的調(diào)用中,一個(gè)典型的特點(diǎn)是可能會(huì)包含一個(gè)無(wú)窮循環(huán)。在這個(gè)循環(huán)中,線(xiàn)程會(huì)不斷嘗試修改共享變量。如果沒(méi)有沖突,修改成功,那么程序退出,否則繼續(xù)嘗試修改。但無(wú)論如何,無(wú)鎖的并行總能保證有一個(gè)線(xiàn)程是可以勝出的,不至于全軍覆沒(méi)。至于臨界區(qū)中競(jìng)爭(zhēng)失敗的線(xiàn)程,他們必須不斷重試,直到自己獲勝。如果運(yùn)氣很不好,總是嘗試不成功,則會(huì)出現(xiàn)類(lèi)似饑餓的先寫(xiě),線(xiàn)程會(huì)停止。

下面就是一段無(wú)鎖的示意代碼,如果修改不成功,那么循環(huán)永遠(yuǎn)不會(huì)停止。

while(!atomicVar.compareAndSet(localVar, localVar+1)){	
        localVal = atomicVar.get();	
}

等待

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

一種典型的無(wú)等待結(jié)果就是RCU(Read Copy Update)。它的基本思想是,對(duì)數(shù)據(jù)的讀可以不加控制。因此,所有的讀線(xiàn)程都是無(wú)等待的,它們既不會(huì)被鎖定等待也不會(huì)引起任何沖突。但在寫(xiě)數(shù)據(jù)的時(shí)候,先獲取原始數(shù)據(jù)的副本,接著只修改副本數(shù)據(jù)(這就是為什么讀可以不加控制),修改完成后,在合適的時(shí)機(jī)回寫(xiě)數(shù)據(jù)。

總結(jié)

本篇文章就到這里了,希望能夠給你帶來(lái)幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!

相關(guān)文章

  • Java中new Date().getTime()指定時(shí)區(qū)的時(shí)間戳問(wèn)題小結(jié)

    Java中new Date().getTime()指定時(shí)區(qū)的時(shí)間戳問(wèn)題小結(jié)

    本文主要介紹了Java中new Date().getTime()時(shí)間戳問(wèn)題小結(jié),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-07-07
  • Java?數(shù)據(jù)結(jié)構(gòu)進(jìn)階二叉樹(shù)題集下

    Java?數(shù)據(jù)結(jié)構(gòu)進(jìn)階二叉樹(shù)題集下

    二叉樹(shù)可以簡(jiǎn)單理解為對(duì)于一個(gè)節(jié)點(diǎn)來(lái)說(shuō),最多擁有一個(gè)上級(jí)節(jié)點(diǎn),同時(shí)最多具備左右兩個(gè)下級(jí)節(jié)點(diǎn)的數(shù)據(jù)結(jié)構(gòu)。本文將帶你通過(guò)實(shí)際題目來(lái)熟練掌握
    2022-04-04
  • Java集合 LinkedList的原理及使用詳解

    Java集合 LinkedList的原理及使用詳解

    這篇文章主要介紹了Java集合 LinkedList的原理及使用詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-11-11
  • Maven鏡像地址配置示例大全

    Maven鏡像地址配置示例大全

    這篇文章主要介紹了Maven鏡像地址配置示例大全,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2020-06-06
  • java中參數(shù)傳遞方式詳解

    java中參數(shù)傳遞方式詳解

    這篇文章主要介紹了java中參數(shù)傳遞方式詳解的相關(guān)資料,需要的朋友可以參考下
    2017-03-03
  • 10k+點(diǎn)贊的 SpringBoot 后臺(tái)管理系統(tǒng)教程詳解

    10k+點(diǎn)贊的 SpringBoot 后臺(tái)管理系統(tǒng)教程詳解

    這篇文章主要介紹了10k+點(diǎn)贊的 SpringBoot 后臺(tái)管理系統(tǒng)教程詳解,本文通過(guò)圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-01-01
  • Java項(xiàng)目--家庭收支記錄程序

    Java項(xiàng)目--家庭收支記錄程序

    本文主要介紹Java基礎(chǔ)階段的一個(gè)小項(xiàng)目——家庭收支記錄程序(附完整源代碼),本項(xiàng)目所用到的主要知識(shí)點(diǎn):基本語(yǔ)法、數(shù)組和方法。本項(xiàng)目并不難,主要是對(duì)Java初學(xué)者的基礎(chǔ)綜合運(yùn)用的訓(xùn)練及檢驗(yàn)
    2021-07-07
  • Java實(shí)現(xiàn)彈窗效果的基本操作(2)

    Java實(shí)現(xiàn)彈窗效果的基本操作(2)

    這篇文章主要為大家詳細(xì)介紹了Java實(shí)現(xiàn)彈窗效果的基本操作第二篇,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-07-07
  • 利用java判斷質(zhì)數(shù)的3種方法代碼示例

    利用java判斷質(zhì)數(shù)的3種方法代碼示例

    這篇文章主要給大家介紹了關(guān)于利用java判斷質(zhì)數(shù)的3種方法,在大于1的整數(shù)中,如果只包含1和本身這兩個(gè)約數(shù),就被稱(chēng)為質(zhì)數(shù)(素?cái)?shù)),文中給出了詳細(xì)的代碼示例,需要的朋友可以參考下
    2023-07-07
  • Java switch()括號(hào)內(nèi)參數(shù)的類(lèi)型要求詳解

    Java switch()括號(hào)內(nèi)參數(shù)的類(lèi)型要求詳解

    這篇文章主要介紹了Java switch()括號(hào)內(nèi)參數(shù)的類(lèi)型要求,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-10-10

最新評(píng)論