使用并發(fā)編程的目標(biāo)是為了提升系統(tǒng)性能,引入多線程后,其實(shí)會(huì)引入額外的開銷,如線程之間的協(xié)調(diào)、增加的上下文切換,線程的創(chuàng)建和銷毀,線程的調(diào)度等等。過度或不恰當(dāng)?shù)氖褂?,可能?huì)導(dǎo)致多線程程序性能甚至比單線程還要低。
影響性能的因素
上下文切換
是指CPU 從一個(gè)進(jìn)程或線程切換到另一個(gè)進(jìn)程或線程。一次上下文切換花費(fèi)5000~10000個(gè)時(shí)鐘周期,幾微秒。在上下文切換過程中,CPU會(huì)停止處理當(dāng)前運(yùn)行的程序,并保存當(dāng)前程序運(yùn)行的具體位置以便之后繼續(xù)運(yùn)行。
內(nèi)存同步
一般指加鎖,對(duì)加鎖來說,需要增加額外的指令,這些指令都需要刷新緩存等等操作。
提升性能的方法
減少鎖的粒度
使用鎖的時(shí)候,鎖所保護(hù)的對(duì)象是多個(gè),當(dāng)這些多個(gè)對(duì)象其實(shí)是獨(dú)立變化的時(shí)候,不如用多個(gè)鎖來一一保護(hù)這些對(duì)象。但是如果有同時(shí)要持有多個(gè)鎖的業(yè)務(wù)方法,要注意避免發(fā)生死鎖。
縮小鎖的范圍
對(duì)鎖的持有實(shí)現(xiàn)快進(jìn)快出,盡量縮短持由鎖的的時(shí)間。將一些與鎖無關(guān)的代碼移出鎖的范圍,特別是一些耗時(shí),可能阻塞的操作。
鎖分段
ConcurrrentHashMap就是典型的鎖分段。
替換獨(dú)占鎖
在業(yè)務(wù)允許的情況下:
1、使用讀寫鎖,
2、用自旋CAS
3、使用系統(tǒng)的并發(fā)容器