10-14 多線程會導(dǎo)致的問題

性能問題有哪些體現(xiàn)涛癌,什么是性能問題?
單線程不存在線程調(diào)度送火,也不存在這方面的開銷拳话,也不需要用鎖也不需要用并發(fā)數(shù)據(jù)結(jié)構(gòu),
多線程除了帶來效率的提高种吸,還帶來了安全問題弃衍,活躍性問題,性能問題骨稿。
可能造成服務(wù)響應(yīng)慢笨鸡,吞吐量低姜钳,資源消耗過高等問題坦冠。

為什么多線程會帶來性能問題?

一哥桥、調(diào)度:上下文切換
1辙浑,什么是上下文?

主要是指發(fā)生線程調(diào)度的時候
什么時候會發(fā)生線程調(diào)度拟糕?
當可運行的線程數(shù)超過了CPU核數(shù)判呕,那么操作系統(tǒng)就要調(diào)度線程了倦踢,以便讓每個線程都有機會運行,雖然最開始的操作系統(tǒng)只有進程沒有線程侠草,后來線程越來越多超過了CPU核數(shù)辱挥,就帶來了線程上下文切換以及調(diào)度的問題。

2边涕,什么是上下文切換晤碘?

假設(shè)當一個線程t1運行到Thread.sleep(),這個時候t1想進入阻塞狀態(tài)功蜓,線程調(diào)度器就會把t1阻塞园爷。然后再讓另一個等待CPU資源的線程t2進入runnable狀態(tài),這就是一次上下文切換式撼,從t1上下文切換到t2上下文童社。這種上下文切換的開銷其實非常大, 有的時候甚至比線程執(zhí)行的時間更長著隆,通常而言一次上下文切換會消耗5000~10000個CPU時鐘周期扰楼,大約是幾微秒,這對于CPU而言已經(jīng)是非常大的開銷了旅东。

3灭抑,什么是上下文?保存現(xiàn)場

與程序計數(shù)器相關(guān)的抵代,一次上下文切換腾节,主要包含以下活動:
(1)首先掛起一個線程,比如上面的t1荤牍,然后把t1線程的狀態(tài)(其實就是該線程的上下文)存在內(nèi)存中的某處案腺。一個線程上下文所包含的經(jīng)典內(nèi)容包括:該線程當前執(zhí)行到哪個指令了,位置在哪里康吵,因為后續(xù)要切換回來繼續(xù)執(zhí)行劈榨,需要跳轉(zhuǎn)到阻塞之前的狀態(tài),所以就需要保存這些信息晦嵌。還包括一些寄存器同辣,這些內(nèi)容都是為了今后我們切換回這個線程上下文后能繼續(xù)執(zhí)行。
(2)在內(nèi)存中檢索下一個進程的上下文并將其在CPU的寄存器中恢復(fù)
(3)跳轉(zhuǎn)到程序計數(shù)器所指向的位置(即跳轉(zhuǎn)到進程被中斷時的代碼行)惭载,以恢復(fù)該進程旱函。

4,緩存開銷(受上下文切換的影響)

對于調(diào)度而言我們的開銷不僅僅是上下文切換的消耗描滔,它的緩存也會帶來開銷棒妨。其實對于CPU而言我們要考慮緩存失效的問題,我們知道程序有很大概率會訪問之前訪問過的數(shù)據(jù)含长,比如for循環(huán)券腔,所以CPU為了加快運行速度伏穆,會根據(jù)不同的算法做很多預(yù)測,把不同的數(shù)據(jù)緩存到CPU中纷纫,這樣下次使用的時候很快就能取出來枕扫,但是一旦執(zhí)行了上下文切換,CPU即將執(zhí)行不同線程的不同代碼辱魁,原來的緩存就失去價值了铡原,所以CPU就需要重新進行緩存,這導(dǎo)致了線程被調(diào)度之后一開始的啟動速度比較慢商叹,因為它之前的緩存大部分都失效了燕刻。所以CPU為了防止過于頻繁的上下文切換帶來過于大的緩存開銷,通常會設(shè)置一個最小執(zhí)行時間剖笙,也就是說兩次上下文切換之間的時間間隔不能小于這個最小執(zhí)行時間卵洗,否則其實切換上下文開銷帶來的損耗都大于程序本身的執(zhí)行了。

5弥咪,何時會導(dǎo)致密集的上下文切換过蹂?搶鎖,IO

搶鎖聚至,IO或者是其他原因?qū)е铝祟l繁的線程阻塞酷勺,會帶來大量的上下文切換,有的時候我們的程序是長時間地利用CPU做計算扳躬,那么這個時候上下文切換就比較少脆诉,

二、協(xié)作:內(nèi)存同步所帶來的開銷

1贷币,我們的編譯器击胜,CPU都會幫我們把程序的指令進行優(yōu)化,可能進行指令重排序役纹,來提高我們的緩存利用率偶摔,或者JVM也會把我們的鎖進行優(yōu)化,比如它發(fā)現(xiàn)我們有些鎖是沒有必要的促脉,會自動刪除鎖辰斋。如果我們?yōu)榱硕嗑€程的安全,加了很多的synchronized瘸味,volatile這些同步手段(可見性)宫仗,在這種情況下,同步手段會使得很多的指令優(yōu)化硫戈,CPU的緩存失效(本來有緩存CPU只要去緩存中取锰什,現(xiàn)在緩存失效只能去主存中同步)下硕,其實就會影響性能丁逝。

2汁胆,關(guān)于內(nèi)存方面,由于JVM規(guī)定我們是有主內(nèi)存以及各個CPU自己的緩存的霜幼,如果我們使用緩存可以大大提高我們執(zhí)行的速度嫩码,因為不必要每次去和主內(nèi)存進行同步。但是罪既,我們使用多線程的時候經(jīng)常會使用synchronized铸题,volatile這些關(guān)鍵字,有時會讓不同線程的緩存失效琢感,這樣也會由于主內(nèi)存同步而帶來開銷丢间。


image.png

計算速度:CPU>寄存器>CPU cache>內(nèi)存>外存
T0,T1分別從主內(nèi)存中讀取數(shù)據(jù)data,拷貝一份到自己本地存儲驹针,線程t0是run在CPU上烘挫,線程會應(yīng)用到CPU本地的數(shù)據(jù)(寄存器或者cache line)來計算data,那么會產(chǎn)生線程本地數(shù)據(jù)和主內(nèi)存不一致的情況柬甥,所以在t0計算完data后要把數(shù)據(jù)寫回主存饮六。
每一次同步主內(nèi)存的數(shù)據(jù)是需要開銷的。synchronized苛蒲,volatile由于保證了可見性卤橄,所以每次要去同步主內(nèi)存?

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末臂外,一起剝皮案震驚了整個濱河市窟扑,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌漏健,老刑警劉巖辜膝,帶你破解...
    沈念sama閱讀 206,378評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異漾肮,居然都是意外死亡厂抖,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,356評論 2 382
  • 文/潘曉璐 我一進店門克懊,熙熙樓的掌柜王于貴愁眉苦臉地迎上來忱辅,“玉大人,你說我怎么就攤上這事谭溉∏蕉” “怎么了?”我有些...
    開封第一講書人閱讀 152,702評論 0 342
  • 文/不壞的土叔 我叫張陵扮念,是天一觀的道長损搬。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么巧勤? 我笑而不...
    開封第一講書人閱讀 55,259評論 1 279
  • 正文 為了忘掉前任嵌灰,我火速辦了婚禮,結(jié)果婚禮上颅悉,老公的妹妹穿的比我還像新娘沽瞭。我一直安慰自己,他們只是感情好剩瓶,可當我...
    茶點故事閱讀 64,263評論 5 371
  • 文/花漫 我一把揭開白布驹溃。 她就那樣靜靜地躺著,像睡著了一般延曙。 火紅的嫁衣襯著肌膚如雪豌鹤。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,036評論 1 285
  • 那天枝缔,我揣著相機與錄音傍药,去河邊找鬼。 笑死魂仍,一個胖子當著我的面吹牛拐辽,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播擦酌,決...
    沈念sama閱讀 38,349評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼俱诸,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了赊舶?” 一聲冷哼從身側(cè)響起睁搭,我...
    開封第一講書人閱讀 36,979評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎笼平,沒想到半個月后园骆,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,469評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡寓调,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,938評論 2 323
  • 正文 我和宋清朗相戀三年锌唾,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片夺英。...
    茶點故事閱讀 38,059評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡晌涕,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出痛悯,到底是詐尸還是另有隱情余黎,我是刑警寧澤,帶...
    沈念sama閱讀 33,703評論 4 323
  • 正文 年R本政府宣布载萌,位于F島的核電站惧财,受9級特大地震影響巡扇,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜垮衷,卻給世界環(huán)境...
    茶點故事閱讀 39,257評論 3 307
  • 文/蒙蒙 一厅翔、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧帘靡,春花似錦、人聲如沸瓤帚。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,262評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽戈次。三九已至轩勘,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間怯邪,已是汗流浹背绊寻。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留悬秉,地道東北人澄步。 一個月前我還...
    沈念sama閱讀 45,501評論 2 354
  • 正文 我出身青樓,卻偏偏與公主長得像和泌,于是被迫代替她去往敵國和親村缸。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 42,792評論 2 345