高并發(fā)下如何合理使用鎖

在并發(fā)環(huán)境下想要共享變量撮奏,一旦涉及修改操作,就需要用到鎖了弯菊。
Java 中的鎖有這么幾種:synchronized纵势、reentrant lock、還有reentrant lock 衍生出的其他鎖比如ReadWriteReentrantLock

鎖性能比較:

這幾種鎖在爭(zhēng)用量級(jí)不同的情況下性能是不同的管钳,就synchronized钦铁、ReentrantLock來(lái)分析比較的話,看到網(wǎng)上有好多博客都在說(shuō)sychronized 在爭(zhēng)用頻次非常高的情況下性能會(huì)急劇下降才漆,這種觀點(diǎn)是存在時(shí)效性的牛曹,就當(dāng)前1.8版本使用體驗(yàn)而言,sychronized在大量爭(zhēng)用的情況性能其實(shí)還好并不會(huì)出現(xiàn)所謂的急劇下降醇滥,倒是在激烈爭(zhēng)用時(shí)sychronized的性能要好一些黎比,這個(gè)問(wèn)題去官網(wǎng)確認(rèn)了下,就現(xiàn)狀而言官方是建議使用sychronized的鸳玩,這次的體驗(yàn)也是sychronized更好阅虫。因?yàn)楫?dāng)前JVM是對(duì)于sychronized做出了優(yōu)化了,借鑒ReentrantLock的CAS加鎖方式怀喉,并且引入了偏向鎖书妻、輕量級(jí)鎖等特性后,常規(guī)情況下兩者比較相似躬拢,實(shí)踐中得到的體驗(yàn)是sychronized性能更好一點(diǎn)躲履,可能是JVM層面加鎖之后,并且編譯器同時(shí)做優(yōu)化Sychronized 更適合在用戶態(tài)把加鎖問(wèn)題解決避免陷入內(nèi)核態(tài)的線程阻塞更有用吧聊闯。

鎖粒度:

synchronized 所支持的鎖粒度相較于ReentrantLock來(lái)說(shuō)是處于劣勢(shì)的工猜,但是對(duì)于大多數(shù)場(chǎng)景來(lái)說(shuō)synchronized足夠用了。

鎖特性:

synchronized 支持的一些偏向鎖只能說(shuō)是性能上的特性不能算是功能上的菱蔬,但是加鎖方便篷帅,不需要顯示加鎖釋放鎖,不容易產(chǎn)生死鎖拴泌,代碼編寫(xiě)簡(jiǎn)單(編寫(xiě)簡(jiǎn)單這事兒并不是很在意魏身,目的是提升性能)
ReentrantLock 特性就比較豐富了,支持公平鎖蚪腐、鎖超時(shí)箭昵,更大程度上避免了死鎖,但是ReentrantLock 能夠控制的粒度更細(xì)回季,并且衍生出來(lái)的工具十分好用家制,比如說(shuō)讀寫(xiě)鎖正林,但是也產(chǎn)生了需要手動(dòng)釋放鎖這個(gè)問(wèn)題。
其他鎖相關(guān)的基礎(chǔ)知識(shí)颤殴,可以看一下我博客Java Concurrent系列的文章觅廓,這里就不過(guò)多贅述了。
這里重點(diǎn)要說(shuō)的是使用鎖的一些方式:

1涵但、鎖選擇

鑒于上面性能比較的結(jié)果杈绸,推薦使用sychronized

2、鎖粒度

粒度要盡可能的控制到小矮瘟,避免不必要的加鎖蝇棉。因?yàn)橥綁K越長(zhǎng),線程持有鎖的時(shí)間就越長(zhǎng)芥永,其他線程等待的時(shí)間就越長(zhǎng),如果整個(gè)都是加鎖的钝吮,那么整個(gè)程序就變成串行處理了埋涧。

3、避免加鎖

一些能夠犧牲空間來(lái)進(jìn)行ThreadLocal處理的奇瘦,就沒(méi)必要使用鎖了棘催,加鎖完全是為了并發(fā)下邏輯的正確,如果有更好的解決方式耳标,請(qǐng)避免使用鎖醇坝,但是如果像是一些非得使用鎖的情況,也務(wù)必主要鎖的粒度次坡,像是直接給函數(shù)加鎖呼猪,實(shí)在是不應(yīng)該。

4砸琅、減少部分加鎖

比如限流計(jì)數(shù)器宋距,我們需要先判定是否大于0再?zèng)Q定是否進(jìn)行減一操作,這是經(jīng)典的競(jìng)態(tài)條件症脂,按理說(shuō)應(yīng)該是加鎖的谚赎,但是如果一共就200個(gè)線程爭(zhēng)用,我們就可以合理的控制了诱篷,count 初始值為1000壶唤,假設(shè)每個(gè)線程只發(fā)起一次請(qǐng)求,我們要保證的是count不會(huì)減到0以下棕所,我們前800次其實(shí)是沒(méi)必要進(jìn)行同步處理的闸盔,只需要用下原子類就可以了。之后后面100多次再產(chǎn)生同步就好了橙凳。

5蕾殴、相關(guān)并發(fā)工具的選擇

在高qps下使用Concurrent 包下的工具時(shí)笑撞,一定要先知道原理或者看看源碼再使用,切不可盲目使用因?yàn)楹芏喙ぞ咭恍┨匦允菦](méi)有用的但是為了這些特性增加了很多額外的加鎖操作钓觉。然后也要知道如果有剛好符合你的需求茴肥,一定要用API 這樣才能得到更好的性能及更大的正確性保證。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末荡灾,一起剝皮案震驚了整個(gè)濱河市瓤狐,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌批幌,老刑警劉巖础锐,帶你破解...
    沈念sama閱讀 219,110評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異荧缘,居然都是意外死亡皆警,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,443評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén)截粗,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)信姓,“玉大人,你說(shuō)我怎么就攤上這事绸罗∫馔疲” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 165,474評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵珊蟀,是天一觀的道長(zhǎng)菊值。 經(jīng)常有香客問(wèn)我,道長(zhǎng)育灸,這世上最難降的妖魔是什么腻窒? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,881評(píng)論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮描扯,結(jié)果婚禮上定页,老公的妹妹穿的比我還像新娘。我一直安慰自己绽诚,他們只是感情好典徊,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,902評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著恩够,像睡著了一般卒落。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上蜂桶,一...
    開(kāi)封第一講書(shū)人閱讀 51,698評(píng)論 1 305
  • 那天儡毕,我揣著相機(jī)與錄音,去河邊找鬼。 笑死腰湾,一個(gè)胖子當(dāng)著我的面吹牛雷恃,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播费坊,決...
    沈念sama閱讀 40,418評(píng)論 3 419
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼倒槐,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了附井?” 一聲冷哼從身側(cè)響起讨越,我...
    開(kāi)封第一講書(shū)人閱讀 39,332評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎永毅,沒(méi)想到半個(gè)月后把跨,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,796評(píng)論 1 316
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡沼死,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,968評(píng)論 3 337
  • 正文 我和宋清朗相戀三年着逐,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,110評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖射沟,靈堂內(nèi)的尸體忽然破棺而出套蒂,到底是詐尸還是另有隱情,我是刑警寧澤吟榴,帶...
    沈念sama閱讀 35,792評(píng)論 5 346
  • 正文 年R本政府宣布魁蒜,位于F島的核電站,受9級(jí)特大地震影響吩翻,放射性物質(zhì)發(fā)生泄漏兜看。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,455評(píng)論 3 331
  • 文/蒙蒙 一狭瞎、第九天 我趴在偏房一處隱蔽的房頂上張望细移。 院中可真熱鬧,春花似錦熊锭、人聲如沸弧轧。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,003評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)精绎。三九已至,卻和暖如春锌妻,著一層夾襖步出監(jiān)牢的瞬間代乃,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,130評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工仿粹, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留搁吓,地道東北人原茅。 一個(gè)月前我還...
    沈念sama閱讀 48,348評(píng)論 3 373
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像堕仔,于是被迫代替她去往敵國(guó)和親擂橘。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,047評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容