多線程并發(fā)編程3-鎖類型

? ? 本文來說一說鎖的各個類型以及之間的差異世蔗。

樂觀鎖與悲觀鎖

? ? 樂觀鎖和悲觀鎖是在數(shù)據(jù)庫中引入的名詞,但在java的并發(fā)鎖中也使用了樂觀鎖和悲觀鎖的思想昼汗。

? ? 樂觀鎖尸诽,認為數(shù)據(jù)在一般情況下不會造成沖突,所以在對數(shù)據(jù)進行讀操作的時候不會加排它鎖绑改,而是在進行數(shù)據(jù)寫的時候馋缅,才會對數(shù)據(jù)沖突與否進行檢測,也就是加排他鎖绢淀。由于樂觀鎖是在提交時才鎖定,所以不會產(chǎn)生任何死鎖瘾腰。juc中CopyOnWriteArrayList就使用了樂觀鎖的思想皆的,寫時加鎖,讀時復制不加鎖蹋盆,在后面的文章會對CopyOnWriteArrayList原理以及源碼進行說明费薄,敬請期待硝全。

? ? 悲觀鎖,相對于樂觀鎖楞抡,悲觀鎖對數(shù)據(jù)被修改持保守態(tài)度伟众,它任務數(shù)據(jù)很容易被修改,所有在數(shù)據(jù)處理前就對數(shù)據(jù)加排他鎖召廷,并在整個處理的過程中都持有該鎖凳厢。

公平鎖與非公平鎖

? ? 通過線程搶占鎖的機制,鎖可以分為公平鎖和非公平鎖竞慢。

? ? 公平鎖先紫,線程在獲取鎖的順序是按照線程請求鎖的時間早晚來決定的,也就是先請求鎖的線程會先獲取到鎖筹煮,也就是FIFO(先進先出)隊列原理遮精。

? ? 非公平鎖,線程在獲取鎖的順序不一定按照請求的早晚來決定败潦,先請求鎖的線程和正在請求鎖的線程本冲,不一定哪個線程會先獲得鎖,這里比較的是正在請求鎖的線程和阻塞隊列中的第一個線程劫扒,后面的文章會講解什么是阻塞隊列檬洞?為什么是比較正在請求鎖的線程和阻塞隊列中的第一個線程而不是阻塞隊列中的所有線程?

? ? java中使用公平鎖和非公平鎖的方式

公平鎖:ReentrantLock pairLock = new ReentrantLock(true);??

非公平鎖:ReentrantLock unpairLock = new ReentrantLock(false);?//false參數(shù)可不傳粟关,默認為false

? ? 建議疮胖,在沒有公平性需求的前提下盡量使用非公平鎖,因為公平鎖會帶來一些性能上的開銷闷板。

獨占鎖與共享鎖

? ? 從鎖是否可以被多個線程獲取的角度澎灸,可以將鎖分為獨占鎖與共享鎖,

? ? 獨占鎖遮晚,保證只能有一個線程獲取到鎖性昭,其他線程獲取鎖的時候就只能被阻塞掛起,排他鎖說的也就是獨占鎖县遣。ReentrantLock類使用的就是獨占鎖的思想糜颠。

? ? 共享鎖,運行多個線程同時獲取同一把鎖萧求,ReentrantReadWriteLock讀寫鎖其兴,就是使用了共享鎖的思想。

可重入鎖? ??

? ? 上面提到了獨占鎖夸政,當一個線程獲取到鎖之后其他線程想獲取鎖時都會被阻塞掛起元旬,那么問題來了,當已獲得鎖的線程再次獲得同一把鎖,該線程會被阻塞掛起嗎匀归?不會被阻塞掛起那這把鎖就是可重入鎖坑资,否則為非可重入鎖。

自旋鎖? ??

? ? 前面提到的鎖都是在獲取不到鎖資源的時候都會被阻塞掛起穆端,一旦阻塞掛起就會發(fā)生上下文切換袱贮,這就會造成性能的損耗。那么自然就會想到在一次獲取不到鎖的時候体啰,能不能多獲取幾次攒巍,從而避免阻塞掛起。自旋鎖就是這樣的思想狡赐,當獲取不到鎖資源的時候窑业,線程不會馬上阻塞掛起,在不放棄CPU使用權(quán)的情況下枕屉,多次嘗試獲取常柄。

? ? 自旋鎖是使用CPU時間換區(qū)線程阻塞掛起上下文切換損耗,但在鎖搶占嚴重的情況下有可能多次獲取鎖都獲取不到最終還是被阻塞掛起搀擂,這樣既消耗的CPU時間又沒有避免上下文切換西潘,所以在鎖搶占嚴重的情況下可以多考慮一下。

? ??? ?今天的分享就到這哨颂,有看不明白的地方一定是我寫的不夠清楚喷市,所有歡迎提任何問題以及改善方法。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
禁止轉(zhuǎn)載威恼,如需轉(zhuǎn)載請通過簡信或評論聯(lián)系作者品姓。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市箫措,隨后出現(xiàn)的幾起案子腹备,更是在濱河造成了極大的恐慌,老刑警劉巖斤蔓,帶你破解...
    沈念sama閱讀 211,743評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件植酥,死亡現(xiàn)場離奇詭異,居然都是意外死亡弦牡,警方通過查閱死者的電腦和手機友驮,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,296評論 3 385
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來驾锰,“玉大人卸留,你說我怎么就攤上這事⊥衷ィ” “怎么了耻瑟?”我有些...
    開封第一講書人閱讀 157,285評論 0 348
  • 文/不壞的土叔 我叫張陵买喧,是天一觀的道長。 經(jīng)常有香客問我匆赃,道長,這世上最難降的妖魔是什么今缚? 我笑而不...
    開封第一講書人閱讀 56,485評論 1 283
  • 正文 為了忘掉前任算柳,我火速辦了婚禮,結(jié)果婚禮上姓言,老公的妹妹穿的比我還像新娘瞬项。我一直安慰自己,他們只是感情好何荚,可當我...
    茶點故事閱讀 65,581評論 6 386
  • 文/花漫 我一把揭開白布囱淋。 她就那樣靜靜地躺著,像睡著了一般餐塘。 火紅的嫁衣襯著肌膚如雪妥衣。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,821評論 1 290
  • 那天戒傻,我揣著相機與錄音税手,去河邊找鬼。 笑死需纳,一個胖子當著我的面吹牛芦倒,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播不翩,決...
    沈念sama閱讀 38,960評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼兵扬,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了口蝠?” 一聲冷哼從身側(cè)響起器钟,我...
    開封第一講書人閱讀 37,719評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎亚皂,沒想到半個月后俱箱,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,186評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡灭必,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,516評論 2 327
  • 正文 我和宋清朗相戀三年狞谱,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片禁漓。...
    茶點故事閱讀 38,650評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡跟衅,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出播歼,到底是詐尸還是另有隱情伶跷,我是刑警寧澤掰读,帶...
    沈念sama閱讀 34,329評論 4 330
  • 正文 年R本政府宣布,位于F島的核電站叭莫,受9級特大地震影響蹈集,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜雇初,卻給世界環(huán)境...
    茶點故事閱讀 39,936評論 3 313
  • 文/蒙蒙 一拢肆、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧靖诗,春花似錦郭怪、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,757評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至促绵,卻和暖如春攒庵,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背绞愚。 一陣腳步聲響...
    開封第一講書人閱讀 31,991評論 1 266
  • 我被黑心中介騙來泰國打工叙甸, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人位衩。 一個月前我還...
    沈念sama閱讀 46,370評論 2 360
  • 正文 我出身青樓裆蒸,卻偏偏與公主長得像,于是被迫代替她去往敵國和親糖驴。 傳聞我的和親對象是個殘疾皇子僚祷,可洞房花燭夜當晚...
    茶點故事閱讀 43,527評論 2 349