1-并發(fā)編程的挑戰(zhàn)

1.上下文切換

CPU通過時間片分配算法來循環(huán)執(zhí)行任務(wù)间驮,當(dāng)前任務(wù)執(zhí)行一個時間片后會切換到下一個任務(wù)。但是马昨,在切換前會保存上一個任務(wù)的狀態(tài)竞帽,以便下次切換回這個任務(wù)時,可以再加載這個任務(wù)的狀態(tài)鸿捧。所以任務(wù)從保存到再加載的過程就是一次上下文切換屹篓。

①如何減少上下文切換

減少上下文切換的方法有無鎖并發(fā)編程、CAS算法匙奴、使用最少線程和使用協(xié)程堆巧。

無鎖并發(fā)編程:多線程競爭鎖時,會引起上下文切換,所以多線程處理數(shù)據(jù)時谍肤,可以用一些辦法來避免使用鎖啦租,如將數(shù)據(jù)的ID按照hash算法取模分段,不同的線程處理不同段的數(shù)據(jù)荒揣。

CAS算法:Java的Atomic包使用CAS算法來更新數(shù)據(jù)篷角,而不需要加鎖。

使用最少線程:避免創(chuàng)建不需要的線程系任,比如任務(wù)很少恳蹲,但是創(chuàng)建了很多線程來處理,這樣會造成大量線程都處于等待狀態(tài)俩滥。

協(xié)程:在單線程里實現(xiàn)多任務(wù)的調(diào)度嘉蕾,并在單線程里維持多個任務(wù)間的切換。

②減少上下文切換案例

a.用jstack命令dump線程信息霜旧,看看pid為3117的進程里的線程都在做什么错忱。

sudo -u admin /opt/ifeve/java/bin/jstack 3117 > /home/tengfi.fangtf/dump17

b.統(tǒng)計所有線程分別處于什么狀態(tài),發(fā)現(xiàn)300多個線程處于WAITING(on object monitor)狀態(tài)颁糟。

grep java.lang.Thread.State dump17 | awk '{print $2$3$4$5} | sort | uniq -c'

c.打開dump文件查看處于WAITING(on object monitor)的線程都在做什么航背。發(fā)現(xiàn)這些線程基本全是Jboss的工作線程喉悴,在await棱貌。說明Jboss線程池里線程接收到的任務(wù)太少,大量線程都閑著箕肃。

d.減少Jboss的工作線程數(shù)婚脱,找到Jboss的線程池配置信息,將maxThreads降到100(原250)勺像。

e.重啟Jboss障贸,再dump線程信息,然后統(tǒng)計WAITING(on object monitor)的線程吟宦,發(fā)現(xiàn)減少了175個篮洁。WAITING的線程少了,系統(tǒng)上下文切換的次數(shù)就會少殃姓,因為每一次從WAITING到RUNNABLE都會進行一次上下文的切換袁波。

2.死鎖

在一些復(fù)雜的場景中,可能會遇到這樣的問題蜗侈,比如t1拿到鎖之后篷牌,因為一些異常情況沒有釋放鎖(死循環(huán))。又或者是t1拿到了一個數(shù)據(jù)庫鎖踏幻,釋放鎖的時候拋出了異常枷颊,沒有釋放掉。

Thread t1 = new Thread(() -> {
    synchronized(A){
        ...
        synchronized(B){
            ...
        }
    }
});
Thread t2 = new Thread(() -> {
    synchronized(B){
        ...
        synchronized(A){
            ...
        }
    }
});

一旦出現(xiàn)死鎖,業(yè)務(wù)是可感知的夭苗,因為不能繼續(xù)提供服務(wù)了信卡,那么只能通過dump線程查看到底是哪個線程出現(xiàn)了問題,一下線程信息告訴我們是DeadLockDemo類的第42行和第31行引起的死鎖听诸。

避免死鎖的幾個常見方法

a.避免一個線程同時獲取多個鎖

b.避免一個線程在鎖內(nèi)同時占用多個資源坐求,盡量保證每個鎖只占用一個資源。

c.嘗試使用定時鎖晌梨,使用lock.tryLock(timeout)來替代使用內(nèi)部鎖機制桥嗤。

d.對于數(shù)據(jù)庫鎖,加鎖和解鎖必須在一個數(shù)據(jù)庫連接里仔蝌,否則會出現(xiàn)解鎖失敗的情況泛领。

3.資源限制的挑戰(zhàn)

①什么是資源限制

資源限制是指在進行并發(fā)編程時,程序的執(zhí)行速度受限于計算機硬件資源或軟件資源敛惊。

例如帶寬只有2Mb/s渊鞋,某個資源的下載速度是1Mb/s,系統(tǒng)啟動10個線程并不會變成10Mb/s瞧挤。

硬件資源限制有:帶寬的上傳/下載速度锡宋、硬盤讀寫速度和CPU的處理速度。

軟件資源限制有:數(shù)據(jù)庫的連接數(shù)和socket連接數(shù)等特恬。

②資源限制引發(fā)的問題

將某段串行的代碼并發(fā)執(zhí)行,但因為受限于資源癌刽,仍然在串行執(zhí)行役首,這時候程序不僅不會加快執(zhí)行,反而會更慢显拜,因為增加了上下文切換和資源調(diào)度的時間衡奥。

③如何解決資源限制的問題

對于硬件資源限制,可以考慮使用集群并行執(zhí)行程序远荠。

對于軟件資源限制矮固,可以考慮使用資源池資源復(fù)用。比如使用連接池將數(shù)據(jù)庫和socket連接復(fù)用譬淳,或者在調(diào)用對方WebService接口獲取數(shù)據(jù)時档址,只建立一個連接。

④在資源限制情況下進行并編程

如何在資源限制的情況下瘦赫,讓程序執(zhí)行的更快呢辰晕?方法就是,根據(jù)不同的資源限制調(diào)整程序的并發(fā)度确虱。比如下載文件程序依賴于帶寬和硬盤讀寫速度含友。有數(shù)據(jù)庫操作時,涉及數(shù)據(jù)庫連接數(shù),如果SQL語句執(zhí)行非尘轿剩快辆童,而線程的數(shù)量比數(shù)據(jù)庫連接數(shù)大很多,則某些線程會被阻塞惠赫,等待數(shù)據(jù)庫連接把鉴。

4.小結(jié)

強烈建議多使用jdk并發(fā)包提供的并發(fā)容器和工具類來解決并發(fā)問題,因為這些類都已經(jīng)通過了充分的測試和優(yōu)化儿咱,均可解決了上面提到的幾個挑戰(zhàn)庭砍。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市混埠,隨后出現(xiàn)的幾起案子怠缸,更是在濱河造成了極大的恐慌,老刑警劉巖钳宪,帶你破解...
    沈念sama閱讀 221,273評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件揭北,死亡現(xiàn)場離奇詭異,居然都是意外死亡吏颖,警方通過查閱死者的電腦和手機搔体,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,349評論 3 398
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來半醉,“玉大人疚俱,你說我怎么就攤上這事》钋海” “怎么了计螺?”我有些...
    開封第一講書人閱讀 167,709評論 0 360
  • 文/不壞的土叔 我叫張陵夯尽,是天一觀的道長瞧壮。 經(jīng)常有香客問我,道長匙握,這世上最難降的妖魔是什么咆槽? 我笑而不...
    開封第一講書人閱讀 59,520評論 1 296
  • 正文 為了忘掉前任,我火速辦了婚禮圈纺,結(jié)果婚禮上秦忿,老公的妹妹穿的比我還像新娘。我一直安慰自己蛾娶,他們只是感情好灯谣,可當(dāng)我...
    茶點故事閱讀 68,515評論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著蛔琅,像睡著了一般胎许。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,158評論 1 308
  • 那天辜窑,我揣著相機與錄音钩述,去河邊找鬼。 笑死穆碎,一個胖子當(dāng)著我的面吹牛牙勘,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播所禀,決...
    沈念sama閱讀 40,755評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼方面,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了色徘?” 一聲冷哼從身側(cè)響起葡幸,我...
    開封第一講書人閱讀 39,660評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎贺氓,沒想到半個月后蔚叨,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,203評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡辙培,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,287評論 3 340
  • 正文 我和宋清朗相戀三年蔑水,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片扬蕊。...
    茶點故事閱讀 40,427評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡搀别,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出尾抑,到底是詐尸還是另有隱情歇父,我是刑警寧澤,帶...
    沈念sama閱讀 36,122評論 5 349
  • 正文 年R本政府宣布再愈,位于F島的核電站榜苫,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏翎冲。R本人自食惡果不足惜垂睬,卻給世界環(huán)境...
    茶點故事閱讀 41,801評論 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望抗悍。 院中可真熱鬧驹饺,春花似錦、人聲如沸缴渊。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,272評論 0 23
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽衔沼。三九已至蝌借,卻和暖如春田柔,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背骨望。 一陣腳步聲響...
    開封第一講書人閱讀 33,393評論 1 272
  • 我被黑心中介騙來泰國打工硬爆, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人擎鸠。 一個月前我還...
    沈念sama閱讀 48,808評論 3 376
  • 正文 我出身青樓缀磕,卻偏偏與公主長得像,于是被迫代替她去往敵國和親劣光。 傳聞我的和親對象是個殘疾皇子袜蚕,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,440評論 2 359

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