本系列文章只做個(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è)連接)