并發(fā)情況如何提升同步代碼塊的性能

使用并發(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ā)容器

?著作權(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)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • layout: posttitle: 《Java并發(fā)編程的藝術(shù)》筆記categories: Javaexcerpt...
    xiaogmail閱讀 6,017評(píng)論 1 19
  • 一.線程安全性 線程安全是建立在對(duì)于對(duì)象狀態(tài)訪問操作進(jìn)行管理,特別是對(duì)共享的與可變的狀態(tài)的訪問 解釋下上面的話: ...
    黃大大吃不胖閱讀 953評(píng)論 0 3
  • 如果你在亞馬遜搜索java相關(guān)的書,本書排名是非常靠前的,豆瓣的評(píng)分也很高。剛好我最近忙找工作,也需要復(fù)習(xí)并發(fā)相關(guān)...
    whiledoing閱讀 4,611評(píng)論 1 6
  • 1. cpu通過時(shí)間片分配算法來循環(huán)執(zhí)行任務(wù),當(dāng)前任務(wù)執(zhí)行一個(gè)時(shí)間片后會(huì)切換到下一任務(wù)。但是,再切換之前會(huì)保存上一...
    冰與河豚魚閱讀 736評(píng)論 0 0
  • Swift1> Swift和OC的區(qū)別1.1> Swift沒有地址/指針的概念1.2> 泛型1.3> 類型嚴(yán)謹(jǐn) 對(duì)...
    cosWriter閱讀 11,629評(píng)論 1 32

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