JAVA并發(fā)編程藝術(shù)(一)—— 并發(fā)編程的挑戰(zhàn)

本系列文章只做個(gè)人讀書(shū)筆記

1、上下文切換

????減少上下文切換的方法有

????????無(wú)鎖并發(fā)編程、

????????CAS算法、

????????使用最少線程

????????使用協(xié)程。

?無(wú)鎖并發(fā)編程

多線程競(jìng)爭(zhēng)鎖時(shí),會(huì)引起上下文切換,所以多線程處理數(shù)據(jù)時(shí),可以用一些辦法來(lái)避免使用鎖,如將數(shù)據(jù)的ID按照Hash算法取模分段,不同的線程處理不同段的數(shù)據(jù)。

CAS算法

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

使用最少線程

避免創(chuàng)建不需要的線程,比如任務(wù)很少,但是創(chuàng)建了很多線程來(lái)處理,這樣會(huì)造成大量線程都處于等待狀態(tài)。

協(xié)程

在單線程里實(shí)現(xiàn)多任務(wù)的調(diào)度,并在單線程里維持多個(gè)任務(wù)間的切換。

奇淫技巧:

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

2、死鎖

????避免死鎖的幾個(gè)常見(jiàn)方法。

????????避免一個(gè)線程同時(shí)獲取多個(gè)鎖。

????????避免一個(gè)線程在鎖內(nèi)同時(shí)占用多個(gè)資源,盡量保證每個(gè)鎖只占用一個(gè)資源。

????????嘗試使用定時(shí)鎖,使用lock.tryLock(timeout)來(lái)替代使用內(nèi)部鎖機(jī)制。

????????對(duì)于數(shù)據(jù)庫(kù)鎖,加鎖和解鎖必須在一個(gè)數(shù)據(jù)庫(kù)連接里,否則會(huì)出現(xiàn)解鎖失敗的情況。

3、資源限制

?硬件資源限制

????????帶寬的上傳/下載速度、

????????硬盤(pán)讀寫(xiě)速度和CPU的處理速度

軟件資源限制

????????數(shù)據(jù)庫(kù)的連接數(shù)

????????socket連接數(shù)等

如何解決資源限制的問(wèn)題

對(duì)于硬件資源限制

????????可以考慮使用集群并行執(zhí)行程序(既然單機(jī)的資源有限制,那么就讓程序在多機(jī)上運(yùn)行。比如使用ODPS、Hadoop或者自己搭建服務(wù)器集群,不同的機(jī)器處理不同的數(shù)據(jù)??梢酝ㄟ^(guò)“數(shù)據(jù)ID%機(jī)器數(shù)”,計(jì)算得到一個(gè)機(jī)器編號(hào),然后由對(duì)應(yīng)編號(hào)的機(jī)器處理這筆數(shù)據(jù))

對(duì)于軟件資源限制

????????可以考慮使用資源池將資源復(fù)用(比如使用連接池將數(shù)據(jù)庫(kù)和Socket連接復(fù)用,或者在調(diào)用對(duì)方webservice接口獲取數(shù)據(jù)時(shí),只建立一個(gè)連接)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容