Java并發(fā)編程-并發(fā)編程帶來的問題

并發(fā)編程帶來的問題

1.上下文切換問題
2.死鎖問題

上下文切換

多線程不一定快

1.線程有創(chuàng)建和上下文切換的開銷

如何減少上下文切換

減少上下文切換的方法有無鎖編程CAS算法舷夺、使用最小線程使用協(xié)程

1.無鎖并發(fā)編程踢关,多線程競爭鎖時笼吟,會引起上下文切換库物,所以多線程處理數(shù)據(jù)時,可以用一些辦法來避免使用鎖贷帮,如將數(shù)據(jù)的ID按照hash算法取模分段戚揭,不同的線程處理不同段的數(shù)據(jù)
2.CAS算法。Java的Atomic包使用CAS算法來更新數(shù)據(jù)撵枢,而不需要加鎖民晒,其實也加了鎖,只不過加鎖于cpu上锄禽,系統(tǒng)開銷可忽略不計
3.使用最小線程潜必。避免創(chuàng)建不需要的線程,比如任務(wù)很少沃但,但是創(chuàng)建很多線程來處理磁滚,這樣會造成大量線程處于等待狀態(tài)
4.協(xié)程,在單線程里實現(xiàn)多任務(wù)調(diào)度宵晚,并在單線程里維持多個任務(wù)間的切換

死鎖

有如下代碼:

package com.fx.pattern.cor.handler;

public class DeadLockDemo {
    private static String A = "A";
    private static String B = "B";

    public static void main(String[] args) {
        new DeadLockDemo().deadLock();
    }

    private void deadLock() {
        Thread t1 = new Thread(new Runnable() {
            @Override
            public void run() {
                synchronized (A) {
                    try {
                        Thread.currentThread().sleep(2000);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }

                    synchronized (B) {
                        System.out.println('1');
                    }
                }
            }
        });

        Thread t2 = new Thread(new Runnable() {
            @Override
            public void run() {
                synchronized (B) {
                    synchronized (A) {
                        System.out.println('2');
                    }
                }
            }
        });

        t1.start();
        t2.start();
    }

這段代碼運行之后會引起死鎖垂攘,t1線程與t2線程互相等待對方釋放鎖。
待程序運行之后淤刃,我們采用如下方式來查看jvm對程序的跟蹤棧信息:
獲取當(dāng)前程序進程id

1.ps aux | grep DeadLockDemo 

進程id如下圖所示:


DeadLockTest PID.png

獲取當(dāng)前程序產(chǎn)生的堆棧信息

2.sudo -u root   jstack -F 32125 > /Users/mark/Desktop/JAVA/dump

獲取到的堆棧信息如下圖所示:


死鎖信息.png

idea中堆棧信息更加明確程序出現(xiàn)死鎖的代碼行數(shù):


死鎖分析.png

避免死鎖的方法

1.避免一個線程同時獲取多個鎖
2.避免一個線程在鎖內(nèi)同時占用多個資源晒他,盡量保證每個鎖只占用一個資源
3.嘗試使用定時鎖,使用lock.tryLock(timeout)來代替使用內(nèi)部鎖機制逸贾。
4.對于數(shù)據(jù)庫鎖陨仅,加鎖和解鎖必須在一個數(shù)據(jù)庫連接里,否則會出現(xiàn)解鎖失敗的情況耕陷。

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

什么是資源限制

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

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

并發(fā)編程,將代碼執(zhí)行速度加快的原則是將代碼中串行執(zhí)行的部分變成并發(fā)執(zhí)行哟沫,但將串行執(zhí)行的代碼演變成并發(fā)執(zhí)行饺蔑,需要考慮到資源限制,資源受限的情況下嗜诀,串行到并發(fā)的演變反而會使程序執(zhí)行變得更慢猾警,因為增加了上下文切換和資源調(diào)度的時間。

如何解決資源限制問題

硬件資源限制隆敢,考慮使用集群并行執(zhí)行程序发皿,既然單機資源有限,那就讓程序在多機上運行拂蝎。
軟件資源限制穴墅,考慮使用資源池將資源復(fù)用,比如使用連接池將數(shù)據(jù)庫和Socket連接復(fù)用,或者在調(diào)用對方webService接口獲取數(shù)據(jù)時玄货,只建立一個連接皇钞。

在資源限制情況下進行并發(fā)編程

1.根據(jù)不同的資源限制調(diào)整程序的并發(fā)度。涉及數(shù)據(jù)庫連接數(shù)的sql操作松捉,如果sql語句執(zhí)行非臣薪纾快,但是線程數(shù)量比數(shù)據(jù)庫連接大很多隘世,則某些線程會被阻塞可柿,等待數(shù)據(jù)庫連接。

博客搬家:大坤的個人博客
歡迎評論哦~

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末丙者,一起剝皮案震驚了整個濱河市复斥,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌械媒,老刑警劉巖永票,帶你破解...
    沈念sama閱讀 218,284評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異滥沫,居然都是意外死亡侣集,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,115評論 3 395
  • 文/潘曉璐 我一進店門兰绣,熙熙樓的掌柜王于貴愁眉苦臉地迎上來世分,“玉大人,你說我怎么就攤上這事缀辩〕袈瘢” “怎么了?”我有些...
    開封第一講書人閱讀 164,614評論 0 354
  • 文/不壞的土叔 我叫張陵臀玄,是天一觀的道長瓢阴。 經(jīng)常有香客問我,道長健无,這世上最難降的妖魔是什么荣恐? 我笑而不...
    開封第一講書人閱讀 58,671評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮累贤,結(jié)果婚禮上叠穆,老公的妹妹穿的比我還像新娘。我一直安慰自己臼膏,他們只是感情好硼被,可當(dāng)我...
    茶點故事閱讀 67,699評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著渗磅,像睡著了一般嚷硫。 火紅的嫁衣襯著肌膚如雪检访。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,562評論 1 305
  • 那天仔掸,我揣著相機與錄音烛谊,去河邊找鬼。 笑死嘉汰,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的状勤。 我是一名探鬼主播鞋怀,決...
    沈念sama閱讀 40,309評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼持搜!你這毒婦竟也來了密似?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,223評論 0 276
  • 序言:老撾萬榮一對情侶失蹤葫盼,失蹤者是張志新(化名)和其女友劉穎残腌,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體贫导,經(jīng)...
    沈念sama閱讀 45,668評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡抛猫,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,859評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了孩灯。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片闺金。...
    茶點故事閱讀 39,981評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖峰档,靈堂內(nèi)的尸體忽然破棺而出败匹,到底是詐尸還是另有隱情,我是刑警寧澤讥巡,帶...
    沈念sama閱讀 35,705評論 5 347
  • 正文 年R本政府宣布掀亩,位于F島的核電站,受9級特大地震影響欢顷,放射性物質(zhì)發(fā)生泄漏槽棍。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,310評論 3 330
  • 文/蒙蒙 一抬驴、第九天 我趴在偏房一處隱蔽的房頂上張望刹泄。 院中可真熱鬧,春花似錦怎爵、人聲如沸特石。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,904評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽姆蘸。三九已至墩莫,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間逞敷,已是汗流浹背狂秦。 一陣腳步聲響...
    開封第一講書人閱讀 33,023評論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留推捐,地道東北人裂问。 一個月前我還...
    沈念sama閱讀 48,146評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像牛柒,于是被迫代替她去往敵國和親堪簿。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,933評論 2 355

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