成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

java高并發(fā)系列 - 第2天:并發(fā)級別

Tony_Zby / 3130人閱讀

摘要:由于臨界區(qū)的存在,多線程之間的并發(fā)必須受到控制。對于非公平鎖來說,系統(tǒng)允許高優(yōu)先級的線程插隊(duì)。這樣有可能導(dǎo)致低優(yōu)先級線程產(chǎn)生饑餓。它要求所有線程都必須在有限步內(nèi)完成,這樣不會引起饑餓問題。

由于臨界區(qū)的存在,多線程之間的并發(fā)必須受到控制。根據(jù)控制并發(fā)的策略,我們可以把并發(fā)的級別分為阻塞、無饑餓、無障礙、無鎖、無等待幾種。

阻塞

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

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

無饑餓(Starvation-Free)

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

無障礙(Obstruction-Free)

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

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

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

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

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

1.查詢數(shù)據(jù),此時(shí)版本號為w_v
2.打開事務(wù)
3.做一些業(yè)務(wù)操作
4.update t set version = version+1 where id = 記錄id and version = w_v;//此行會返回影響的行數(shù)c
5.

if(c>0){
        //提交事務(wù)
    }else{
        //回滾事務(wù)
    }

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

無鎖(Lock-Free)

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

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

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

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

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

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

喜歡就關(guān)注我吧

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/75880.html

相關(guān)文章

  • java并發(fā)系列 - 21java中的CAS操作,java并發(fā)的基石

    摘要:方法由兩個(gè)參數(shù),表示期望的值,表示要給設(shè)置的新值。操作包含三個(gè)操作數(shù)內(nèi)存位置預(yù)期原值和新值。如果處的值尚未同時(shí)更改,則操作成功。中就使用了這樣的操作。上面操作還有一點(diǎn)是將事務(wù)范圍縮小了,也提升了系統(tǒng)并發(fā)處理的性能。 這是java高并發(fā)系列第21篇文章。 本文主要內(nèi)容 從網(wǎng)站計(jì)數(shù)器實(shí)現(xiàn)中一步步引出CAS操作 介紹java中的CAS及CAS可能存在的問題 悲觀鎖和樂觀鎖的一些介紹及數(shù)據(jù)庫...

    zorro 評論0 收藏0
  • java并發(fā)系列 - 19:JUC中的Executor框架詳解1,全面掌握java并發(fā)相關(guān)技術(shù)

    摘要:有三種狀態(tài)運(yùn)行關(guān)閉終止。類類,提供了一系列工廠方法用于創(chuàng)建線程池,返回的線程池都實(shí)現(xiàn)了接口。線程池的大小一旦達(dá)到最大值就會保持不變,在提交新任務(wù),任務(wù)將會進(jìn)入等待隊(duì)列中等待。此線程池支持定時(shí)以及周期性執(zhí)行任務(wù)的需求。 這是java高并發(fā)系列第19篇文章。 本文主要內(nèi)容 介紹Executor框架相關(guān)內(nèi)容 介紹Executor 介紹ExecutorService 介紹線程池ThreadP...

    icattlecoder 評論0 收藏0
  • java并發(fā)系列 - 5:深入理解進(jìn)程和線程

    摘要:一旦等到期望的事件,線程就會再次進(jìn)入運(yùn)行狀態(tài)。表示結(jié)束狀態(tài),線程執(zhí)行完畢之后進(jìn)入結(jié)束狀態(tài)。一個(gè)進(jìn)程可以包括多個(gè)線程。 進(jìn)程 進(jìn)程(Process)是計(jì)算機(jī)中的程序關(guān)于某數(shù)據(jù)集合上的一次運(yùn)行活動,是系統(tǒng)進(jìn)行資源分配和調(diào)度的基本單位,是操作系統(tǒng)結(jié)構(gòu)的基礎(chǔ)。程序是指令、數(shù)據(jù)及其組織形式的描述,進(jìn)程是程序的實(shí)體。 進(jìn)程具有的特征: 動態(tài)性:進(jìn)程是程序的一次執(zhí)行過程,是臨時(shí)的,有生命期的,是動態(tài)...

    233jl 評論0 收藏0
  • java并發(fā)系列 - 4:JMM相關(guān)的一些概念

    摘要:我們需要先了解這些概念。在中,其表現(xiàn)在對于共享變量的某些操作,是不可分的,必須連續(xù)的完成。有序性有序性指的是程序按照代碼的先后順序執(zhí)行。 JMM(java內(nèi)存模型),由于并發(fā)程序要比串行程序復(fù)雜很多,其中一個(gè)重要原因是并發(fā)程序中數(shù)據(jù)訪問一致性和安全性將會受到嚴(yán)重挑戰(zhàn)。如何保證一個(gè)線程可以看到正確的數(shù)據(jù)呢?這個(gè)問題看起來很白癡。對于串行程序來說,根本就是小菜一碟,如果你讀取一個(gè)變量,這個(gè)...

    mengbo 評論0 收藏0
  • java并發(fā)系列 - 3:有關(guān)并行的兩個(gè)重要定律

    摘要:阿姆達(dá)爾定律定律是計(jì)算機(jī)科學(xué)中非常重要的定律。它定義了串行系統(tǒng)并行化后的加速比的計(jì)算公式和理論上線。需要從根本上修改程序的串行行為,提高系統(tǒng)內(nèi)可并行化的模塊比重,在此基礎(chǔ)上,合理增加并行處理器數(shù)量,才能以最小的投入,得到最大的加速比。 有關(guān)為什么要使用并行程序的問題前面已經(jīng)進(jìn)行了簡單的探討??偟膩碚f,最重要的應(yīng)該是處于兩個(gè)目的。 第一,為了獲得更好的性能; 第二,由于業(yè)務(wù)模型的需要,確...

    liaoyg8023 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<