同步容器和工具類
1:concurrentHashMap
concurrentHashMap采用的是鎖分段技術(shù)望拖。
HashTab容器在競(jìng)爭(zhēng)的并發(fā)環(huán)境下掏熬,效率低下的原因是:所有訪問HashTab的線程必須競(jìng)爭(zhēng)同一把鎖,加入容器里面有很多把鎖,那么每一把鎖都只鎖定其中一部分铐伴,當(dāng)多線程并發(fā)訪問的時(shí)候,線程間就不會(huì)存在鎖競(jìng)爭(zhēng)俏讹。
結(jié)構(gòu):Segment數(shù)組和HashEntry數(shù)組結(jié)構(gòu)組成当宴,Segment結(jié)構(gòu)其實(shí)和HashMap結(jié)構(gòu)效果一樣,是一種數(shù)組和鏈表的結(jié)構(gòu)泽疆,一個(gè)Segment數(shù)組里面包含了一個(gè)HashEntry數(shù)組户矢。鎖是鎖著Segment。
2:怎么減少線程的上下文切換
1:CAS算法殉疼,采用原子類
2:根據(jù)具體任務(wù)場(chǎng)景來創(chuàng)建比較合適的線程
3:無鎖并發(fā)編程逗嫡,多線程并發(fā)使用的時(shí)候,會(huì)引起上下文切換株依,所以多線程處理數(shù)據(jù)時(shí)驱证。可以采用一些方法來避免鎖恋腕。
3:阻塞隊(duì)列
BlockingQueue是所有的阻塞隊(duì)列的父接口抹锄。具體的實(shí)現(xiàn)例子有:
1:LinkedBlockingQueue:鏈表實(shí)現(xiàn)
2:ArrayedBlockingQueue:數(shù)組
3:SynchronousQueue:同步隊(duì)列:一個(gè)調(diào)用插入方法的線程必須等待另一個(gè)線程調(diào)用取出方法,隊(duì)列里面沒有容量荠藤。
4:PriorityBlockingQueue優(yōu)先級(jí)阻塞隊(duì)列
5:DelayQueue 延遲隊(duì)列伙单。
4:同步工具
同步工具主要包括1:CountDownLatch(一次性柵欄)、2:Semaphore(信號(hào)量)哈肖、3:CyclicBarrier(循環(huán)同步柵欄)吻育、4:Exchanger(線程間交換器)和Phaser。
注意淤井,CountDownLatch是一次性的布疼,當(dāng)條件滿足后摊趾,它不能再回到初始狀態(tài),也不能阻止后續(xù)線程了游两。 如果需要可以使用CyclicBarrier砾层。 每當(dāng)調(diào)用await方法時(shí),內(nèi)部調(diào)用了tryAcquireShared方法贱案,由于state>0肛炮,因此調(diào)用的線程會(huì)阻塞在共享鎖的循環(huán)框架中。每當(dāng)調(diào)用countDown方法時(shí)宝踪,內(nèi)部調(diào)用了releaseShared方法侨糟,而此方法將會(huì)把state的值減1,當(dāng)state的值為0時(shí)瘩燥,tryAcquireShared中的循環(huán)將會(huì)喚醒所有等待線程粟害,使之繼續(xù)運(yùn)行。由于tryAcquireShared方法中沒有修改state值颤芬,因此CountDownLatch只能一次性使用,不能循環(huán)使用套鹅。
CyclicBarrier得到了一個(gè)parties數(shù)值站蝠,它代表參與的線程數(shù)量,以及一個(gè)Runnable的實(shí)例卓鹿,它代表被激發(fā)的事件菱魔。每當(dāng)有線程調(diào)用await時(shí),parties減1吟孙。若此時(shí)parties大于0澜倦,線程就在Condition處阻塞,若parties等于0杰妓,則此Condition會(huì)調(diào)用signalAll釋放所有等待線程藻治,并觸發(fā)事件,同時(shí)將parties復(fù)原巷挥。因此所有的線程又進(jìn)入下一輪循環(huán)桩卵。
Semaphore:在多個(gè)任務(wù)爭(zhēng)奪幾個(gè)有限的共享資源時(shí)使用。調(diào)用acquire方法獲取一個(gè)許可倍宾,成功獲取的線程繼續(xù)執(zhí)行雏节,否則就阻塞;調(diào)用release方法釋放一個(gè)許可高职。每當(dāng)有空余的許可時(shí)钩乍,阻塞的線程和其他線程可競(jìng)爭(zhēng)許可