鎖性能優(yōu)化

優(yōu)化思路:避免死鎖召娜、減少鎖粒度、鎖分離等
一惊楼、線程開(kāi)銷(xiāo)
1.處理線程任務(wù)外玖瘸,還要維護(hù)多線程環(huán)境的特有信息,如:線程本身的元數(shù)據(jù)檀咙,線程的調(diào)度雅倒,線程上下文的切換等,更多的在于多線程的調(diào)度弧可。
二蔑匣、避免死鎖
死鎖是多線程特有的問(wèn)題,在死鎖時(shí)棕诵,線程間互相等待資源裁良,而又不釋放鎖定的資源,導(dǎo)致一直等待校套。
一般需要滿足以上條件:
1.互斥條件:一個(gè)資源只能有一個(gè)進(jìn)程使用
2.請(qǐng)求與保持條件:對(duì)已獲得的資源不釋放
3.不剝奪條件:進(jìn)程已獲得資源价脾,在進(jìn)程執(zhí)行完之前,不能強(qiáng)行剝奪
4.循環(huán)等待條件:若干線程形成一種頭尾相接的循環(huán)等待資源
就像形成頭尾相連的四個(gè)小車(chē)一樣

package mythreadpool;

    public class DeadThread implements Runnable {

        public String username;
        public Object lock1 = new Object();
        public Object lock2 = new Object();

        @Override
        public void run() {
            // TODO Auto-generated method stub
            if (username.equals("a")) {
                synchronized (lock1) {
                    try {
                        System.out.println("username = " + username);
                        System.out.println(Thread.currentThread().getName());
                        Thread.sleep(3000);
                    } catch (Exception e) {
                        // TODO: handle exception
                        e.printStackTrace();
                    }
                    synchronized (lock2) {
                        System.out.println("按lock1->lock2的順序執(zhí)行代碼");
                    }
                }
            }
            if (username.equals("b")) {
                synchronized (lock2) {
                    try {
                        System.out.println("username = " + username);
                        System.out.println(Thread.currentThread().getName());
                        Thread.sleep(3000);

                    } catch (Exception e) {
                        // TODO: handle exception
                        e.printStackTrace();
                    }
                    synchronized (lock1) {
                        System.out.println("按lock2->lock1順序執(zhí)行代碼");
                    }
                }

            }
        }

        public void setFlag(String username) {
            this.username = username;
        }

        public static void main(String[] args) {

            DeadThread dt1 = new DeadThread();
            dt1.setFlag("a");
            Thread t1 = new Thread(dt1);
            t1.start();

            try {
                Thread.sleep(2000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }

            dt1.setFlag("b");
            Thread t2 = new Thread(dt1);

            t2.start();
        }

}

以上線程1獲得了lock1,接著去請(qǐng)求lock2笛匙;線程2獲得lock2,接著請(qǐng)求lock1侨把。由于線程2持有l(wèi)ock2不能釋放,而線程1去請(qǐng)求lock2無(wú)法獲得則一直等待妹孙;而線程1持有l(wèi)ock1秋柄,線程2去請(qǐng)求lock1無(wú)法獲得則一直等待,這樣導(dǎo)致兩個(gè)線程一直等待爭(zhēng)搶資源蠢正,循環(huán)等待
死鎖檢測(cè):
1.使用Jconsole骇笔,檢測(cè)線程死鎖,可以看到死鎖代碼行
2.使用線程dump,可以打印輸出locked,查找到死鎖情況
破死鎖笨触,可以破壞導(dǎo)致死鎖的四個(gè)條件的任何一個(gè)懦傍。
三、減少鎖的持有時(shí)間
鎖的作用范圍越小越精確旭旭,比如:

synchronized (lock1) {
                    try {
                        othercode1();
                        synchronized method();
                        othercode2();
                    } catch (Exception e) {
                        // TODO: handle exception
                        e.printStackTrace();
                    }
                }

假設(shè)othercode1和othercode2 耗時(shí)較長(zhǎng) ,且無(wú)需同步葱跋,則需要將synchronized加在 需要同步的代碼塊上持寄。
四、減少鎖的粒度
在ConcurrentMap類(lèi)使用分段鎖娱俺,將整個(gè)大對(duì)象拆分成多個(gè)segments稍味,然后對(duì)每個(gè)segment加鎖,從而實(shí)現(xiàn)高并發(fā)荠卷,減少整體鎖的時(shí)間模庐。
五、使用讀寫(xiě)鎖代替獨(dú)占鎖
讀寫(xiě)鎖利用了讀寫(xiě)鎖分類(lèi)的思想油宜,從而針對(duì)讀多寫(xiě)少的情況進(jìn)行性能的優(yōu)化
六掂碱、原子操作
原子操作如 AtomicInteger等采用CAS思想設(shè)計(jì),CompareAndSet慎冤,是一種無(wú)鎖的實(shí)現(xiàn)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末疼燥,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子蚁堤,更是在濱河造成了極大的恐慌醉者,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,123評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件披诗,死亡現(xiàn)場(chǎng)離奇詭異撬即,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)呈队,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,031評(píng)論 2 384
  • 文/潘曉璐 我一進(jìn)店門(mén)剥槐,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人宪摧,你說(shuō)我怎么就攤上這事才沧。” “怎么了绍刮?”我有些...
    開(kāi)封第一講書(shū)人閱讀 156,723評(píng)論 0 345
  • 文/不壞的土叔 我叫張陵温圆,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我孩革,道長(zhǎng)岁歉,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,357評(píng)論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮锅移,結(jié)果婚禮上熔掺,老公的妹妹穿的比我還像新娘。我一直安慰自己非剃,他們只是感情好置逻,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,412評(píng)論 5 384
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著备绽,像睡著了一般券坞。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上肺素,一...
    開(kāi)封第一講書(shū)人閱讀 49,760評(píng)論 1 289
  • 那天恨锚,我揣著相機(jī)與錄音,去河邊找鬼倍靡。 笑死猴伶,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的塌西。 我是一名探鬼主播他挎,決...
    沈念sama閱讀 38,904評(píng)論 3 405
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼捡需!你這毒婦竟也來(lái)了雇盖?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 37,672評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤栖忠,失蹤者是張志新(化名)和其女友劉穎崔挖,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體庵寞,經(jīng)...
    沈念sama閱讀 44,118評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡狸相,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,456評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了捐川。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片脓鹃。...
    茶點(diǎn)故事閱讀 38,599評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖古沥,靈堂內(nèi)的尸體忽然破棺而出瘸右,到底是詐尸還是另有隱情,我是刑警寧澤岩齿,帶...
    沈念sama閱讀 34,264評(píng)論 4 328
  • 正文 年R本政府宣布太颤,位于F島的核電站,受9級(jí)特大地震影響盹沈,放射性物質(zhì)發(fā)生泄漏龄章。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,857評(píng)論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望做裙。 院中可真熱鬧岗憋,春花似錦、人聲如沸锚贱。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,731評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)拧廊。三九已至监徘,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間卦绣,已是汗流浹背飞蚓。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,956評(píng)論 1 264
  • 我被黑心中介騙來(lái)泰國(guó)打工滤港, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留趴拧,地道東北人溅漾。 一個(gè)月前我還...
    沈念sama閱讀 46,286評(píng)論 2 360
  • 正文 我出身青樓添履,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親脑又。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,465評(píng)論 2 348

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

  • 1问麸、競(jìng)態(tài)條件: 定義:競(jìng)態(tài)條件指的是一種特殊的情況,在這種情況下各個(gè)執(zhí)行單元以一種沒(méi)有邏輯的順序執(zhí)行動(dòng)作严卖,從而導(dǎo)致...
    Hughman閱讀 1,285評(píng)論 0 7
  • 本文是我自己在秋招復(fù)習(xí)時(shí)的讀書(shū)筆記席舍,整理的知識(shí)點(diǎn)哮笆,也是為了防止忘記,尊重勞動(dòng)成果稠肘,轉(zhuǎn)載注明出處哦福铅!如果你也喜歡项阴,那...
    波波波先森閱讀 11,242評(píng)論 4 56
  • 本文首發(fā)于我的個(gè)人博客:尾尾部落 本文是我刷了幾十篇一線互聯(lián)網(wǎng)校招java后端開(kāi)發(fā)崗位的面經(jīng)后總結(jié)的多線程相關(guān)題目...
    繁著閱讀 1,992評(píng)論 0 7
  • 一個(gè)高中舊友突然發(fā)了條微博,說(shuō)為什么人要經(jīng)受這么多痛苦,是不是只有死才能解脫拷沸。 我沒(méi)直接私信問(wèn)他色查,而是打電話叫他過(guò)...
    ae142234e286閱讀 332評(píng)論 0 1
  • 形之美,人人可見(jiàn)撞芍,心之美秧了,非眼能看到,我愿意獨(dú)享序无。
    相相相柳閱讀 165評(píng)論 0 0