進(jìn)程與線程:線程的并發(fā)工具類

2耍共、線程的并發(fā)工具類

一乃沙、Fork-Join

體現(xiàn)了“分而治之”設(shè)計(jì)思想:將一個(gè)大問題分割為相同改的小問題,且小問題之間無關(guān)聯(lián)

十大計(jì)算機(jī)經(jīng)典算法:快速排序唉锌、堆排序隅肥、歸并排序、二分查找袄简、線性查找腥放、深度優(yōu)先、廣度優(yōu)先绿语、Dijkstra秃症、動(dòng)態(tài)規(guī)劃、樸素貝葉斯分類

其中快速排序汞舱、歸并排序伍纫、二分查找都屬于分而治之的思想

Fork-Join原理

Fork-Join框架:就是在必要的情況下,將一個(gè)大任務(wù)昂芜,進(jìn)行拆分(fork)成若干個(gè)小任務(wù)(拆到不可再拆時(shí))莹规,再將一個(gè)個(gè)的小任務(wù)運(yùn)算的結(jié)果進(jìn)行join匯總。

Fork-Join的使用

我們要使用 ForkJoin 框架泌神,必須首先創(chuàng)建一個(gè) ForkJoin 任務(wù)良漱。它提供在任務(wù) 中執(zhí)行 fork 和 join 的操作機(jī)制,通常我們不直接繼承 ForkjoinTask 類欢际,只需要直接繼承其子類母市。

public abstract class ForkJoinTask<V>
  1. RecursiveAction,用于沒有返回結(jié)果的任務(wù)

public abstract class RecursiveAction extends ForkJoinTask<Void>
  1. RecursiveTask损趋,用于有返回值的任務(wù)

    public abstract class RecursiveTask<V> extends ForkJoinTask<V> 
    

    task 要通過 ForkJoinPool 來執(zhí)行患久,使用 invoke或submit/execute 提交,兩者的區(qū)別是:invoke 是同步執(zhí)行浑槽,調(diào)用之后需要等待任務(wù)完成蒋失,才能執(zhí)行后面的代碼;submit/execute是異步執(zhí)行桐玻。submit和execute區(qū)別:submit有返回值篙挽;execute無返回值。

  2. compute()方法:

    protected abstract V compute();//實(shí)現(xiàn)compute()方法做自己的事情
    

    在我們自己實(shí)現(xiàn)的 compute 方法里镊靴,首先需要判斷任務(wù)是否足夠小铣卡,如果 足夠小就直接執(zhí)行任務(wù)链韭。如果不足夠小,就必須分割成兩個(gè)子任務(wù)煮落,每個(gè)子任務(wù)在調(diào)用 invokeAll()方法時(shí)敞峭,又會(huì)進(jìn)入 compute()方法,看看當(dāng)前子任務(wù)是否需要繼續(xù)分割成孫任務(wù)州邢,如果不需要繼續(xù)分割儡陨,則執(zhí)行當(dāng)前子任務(wù)并返回結(jié)果。

  3. join()方法:

    匯總合并量淌,使用 join 方法會(huì)等待子任務(wù)執(zhí)行完并得到其結(jié)果骗村。是個(gè)阻塞方法。

二呀枢、CountDownLatch的作用胚股、應(yīng)用場景和實(shí)戰(zhàn):

閉鎖,CountDownLatch 這個(gè)類能夠使一個(gè)線程等待其他線程完成各自的工作后再執(zhí)行裙秋。例如琅拌,應(yīng)用程序的主線程希望在負(fù)責(zé)啟動(dòng)框架服務(wù)的線程已經(jīng)啟動(dòng)所有的框架服務(wù)之后再執(zhí)行。

CountDownLatch 是通過一個(gè)計(jì)數(shù)器來實(shí)現(xiàn)的摘刑,計(jì)數(shù)器的初始值為初始任務(wù)的數(shù)量进宝。每當(dāng)完成了一個(gè)任務(wù)后,計(jì)數(shù)器的值就會(huì)減1 (CountDownLatch.countDown()方法)枷恕。當(dāng)計(jì)數(shù)器值到達(dá)0時(shí)党晋,它表示所有的已經(jīng)完成了任務(wù),然后在閉鎖上等待 CountDownLatch.await()方法的線程就可以恢復(fù)執(zhí)行任務(wù)徐块。

應(yīng)用場景:

實(shí)現(xiàn)最大的并行性:有時(shí)我們想同時(shí)啟動(dòng)多個(gè)線程未玻,實(shí)現(xiàn)最大程度的并行性。 例如胡控,我們想測試一個(gè)單例類扳剿。如果我們創(chuàng)建一個(gè)初始計(jì)數(shù)為 1 的 CountDownLatch,并讓所有線程都在這個(gè)鎖上等待昼激,那么我們可以很輕松地完成 測試庇绽。我們只需調(diào)用 一次 countDown()方法就可以讓所有的等待線程同時(shí)恢復(fù)執(zhí)行。

三橙困、CAS(Compare And Swap)

實(shí)現(xiàn)原子操作可以使用鎖機(jī)制敛劝。但synchronized關(guān)鍵字是基于阻塞的鎖機(jī)制,也就是說當(dāng)一個(gè)線程擁有鎖的時(shí)候纷宇,訪問同一資源的其它線程需要等待,直到該線程釋放鎖是相對于一些需要復(fù)雜操作蛾方。而一些簡單的應(yīng)用場景像捶,如加減操作上陕,使用同步鎖就顯得不那么靈活了。

基本原理:

利用了現(xiàn)代處理器都支持的CAS指令拓春,循環(huán)這個(gè)指令释簿,直至成功為止

基本思路就是,如果這個(gè)地址上的值和期望的值相等硼莽,則給其賦予新值庶溶,否則不做任何事兒,但是要返回原值是多少懂鸵。循環(huán)CAS就是在一個(gè)循環(huán)里不斷的做cas操作偏螺,直到成功為止

流程.png

CAS實(shí)現(xiàn)原子操作的三大問題

  1. ABA問題

    因?yàn)镃AS需要在操作值的時(shí)候,檢查值有沒有發(fā)生變化匆光,如果沒有發(fā)生變化則更新套像,但是如果一個(gè)值原來是A,變成了B终息,又變成了A夺巩,那么使用CAS進(jìn)行檢查時(shí)會(huì)發(fā)現(xiàn)它的值沒有發(fā)生變化,但是實(shí)際上卻變化了周崭。

    ABA問題的解決思路就是使用版本戳柳譬。

  2. 循環(huán)時(shí)間長開銷大

    自旋CAS如果長時(shí)間不成功,會(huì)給CPU帶來非常大的執(zhí)行開銷续镇。

  3. 只能保證一個(gè)共享變量的原子操作

    當(dāng)對一個(gè)共享變量執(zhí)行操作時(shí)美澳,我們可以使用循環(huán)CAS的方式來保證原子操作,但是對多個(gè)共享變量操作時(shí)磨取,循環(huán)CAS就無法保證操作的原子性人柿,這個(gè)時(shí)候就可以用鎖

Jdk中相關(guān)原子操作類的使用

  1. 更新基本類型類:AtomicInteger 、AtomicBoolean忙厌、AtomicLong
  1. 更新數(shù)組類:AtomicIntegerArray凫岖、AtomicLongArray、AtomicReferenceArray
  1. 更新引用類型:AtomicReference逢净、AtomicStampedReference哥放、AtomicMarkableReference

    AtomicReference解決的是只能保證一個(gè)共享變量的原子操作,將多個(gè)變量組成一個(gè)對象進(jìn)行操作爹土;

    AtomicStampedReference和AtomicMarkableReference差不多甥雕,都是利用版本戳的形式記錄了每次改變以后的版本號。不同點(diǎn)是胀茵,前者使用了pair的intstamp作為計(jì)數(shù)器使用社露,關(guān)心的是動(dòng)過幾次。而后者的pair使用的是boolean琼娘,關(guān)心的是有沒有被人動(dòng)過峭弟。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末附鸽,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子瞒瘸,更是在濱河造成了極大的恐慌坷备,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,591評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件情臭,死亡現(xiàn)場離奇詭異省撑,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)俯在,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,448評論 3 392
  • 文/潘曉璐 我一進(jìn)店門竟秫,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人朝巫,你說我怎么就攤上這事鸿摇。” “怎么了劈猿?”我有些...
    開封第一講書人閱讀 162,823評論 0 353
  • 文/不壞的土叔 我叫張陵拙吉,是天一觀的道長。 經(jīng)常有香客問我揪荣,道長筷黔,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,204評論 1 292
  • 正文 為了忘掉前任仗颈,我火速辦了婚禮佛舱,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘挨决。我一直安慰自己请祖,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,228評論 6 388
  • 文/花漫 我一把揭開白布脖祈。 她就那樣靜靜地躺著肆捕,像睡著了一般。 火紅的嫁衣襯著肌膚如雪盖高。 梳的紋絲不亂的頭發(fā)上慎陵,一...
    開封第一講書人閱讀 51,190評論 1 299
  • 那天,我揣著相機(jī)與錄音喻奥,去河邊找鬼席纽。 笑死,一個(gè)胖子當(dāng)著我的面吹牛撞蚕,可吹牛的內(nèi)容都是我干的润梯。 我是一名探鬼主播,決...
    沈念sama閱讀 40,078評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼仆救!你這毒婦竟也來了抒和?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,923評論 0 274
  • 序言:老撾萬榮一對情侶失蹤彤蔽,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后庙洼,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體顿痪,經(jīng)...
    沈念sama閱讀 45,334評論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,550評論 2 333
  • 正文 我和宋清朗相戀三年油够,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了蚁袭。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,727評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡石咬,死狀恐怖揩悄,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情鬼悠,我是刑警寧澤删性,帶...
    沈念sama閱讀 35,428評論 5 343
  • 正文 年R本政府宣布,位于F島的核電站焕窝,受9級特大地震影響蹬挺,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜它掂,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,022評論 3 326
  • 文/蒙蒙 一巴帮、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧虐秋,春花似錦榕茧、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,672評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至起愈,卻和暖如春只恨,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背抬虽。 一陣腳步聲響...
    開封第一講書人閱讀 32,826評論 1 269
  • 我被黑心中介騙來泰國打工官觅, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人阐污。 一個(gè)月前我還...
    沈念sama閱讀 47,734評論 2 368
  • 正文 我出身青樓休涤,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子功氨,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,619評論 2 354

推薦閱讀更多精彩內(nèi)容