Java鎖機(jī)制- - 草稿 - 草稿

可重入鎖夷蚊、可中斷鎖构挤、公平鎖、讀寫鎖惕鼓、自旋鎖筋现。

鎖的相關(guān)概念介紹

1、可重入鎖

如果鎖具有可重入性箱歧,則稱為可重入鎖矾飞,synchronized和reentranLoke都是可重入鎖⊙叫希可重入性在我看來(lái)是表明了鎖的分配機(jī)制洒沦,基于線程的分配,而不是基于方法調(diào)用的分配价淌。比如說(shuō)當(dāng)一個(gè)線程執(zhí)行到某個(gè)synchronized方法method1時(shí)申眼,在方法method1內(nèi)部又調(diào)用了另一個(gè)synchronized方法method2,此時(shí)線程不必重新申請(qǐng)鎖蝉衣,而是可以直接執(zhí)行方法method2括尸。

假如synchronized鎖不具備可重入性,當(dāng)線程執(zhí)行到synchronized方法method1中的synchronized方法method2時(shí)病毡,線程會(huì)嘗試獲取鎖濒翻,由于synchronized鎖是這個(gè)線程本身持有的,此時(shí)線程就會(huì)陷入一種等待自身釋放鎖的無(wú)限等待中剪验。

由于synchronized鎖和lock鎖都具有可重入性肴焊,所以就不會(huì)出現(xiàn)上述情況。

2功戚、可中斷鎖

顧名思義娶眷,就是可以執(zhí)行中斷操作的鎖。

在java中啸臀,synchronized是不可中斷鎖届宠,而lock是可中斷鎖。

如果某一線程在執(zhí)行獲取鎖的過(guò)程中等待的時(shí)間過(guò)長(zhǎng)乘粒,此時(shí)這個(gè)線程不想等待了豌注,我們可以讓這個(gè)線程本身中斷等待或者讓另一線程來(lái)中斷等待,這種可以被中斷的鎖就是可中斷鎖灯萍。

3轧铁、公平鎖

公平鎖就是盡量以公平的方式來(lái)獲取鎖,比如當(dāng)一個(gè)鎖被釋放時(shí)旦棉,等待時(shí)間最久(最先申請(qǐng)鎖)的那個(gè)線程會(huì)獲得該鎖齿风,這就是公平鎖。

非公平鎖就是無(wú)法保證鎖的獲取是按照請(qǐng)求順序進(jìn)行的绑洛,這樣就可能導(dǎo)致某個(gè)或某些線程永遠(yuǎn)獲取不到鎖救斑。

在Java中,synchronized鎖是非公平鎖真屯,它無(wú)法保證等待的線程獲取鎖的順序脸候。

reentrantlock鎖和reentrantReadWirteLock鎖,他們默認(rèn)情況下是非公平鎖绑蔫,但是可以設(shè)置為公平鎖运沦。

reentrantlock類中定義了2個(gè)靜態(tài)內(nèi)部類,NotFairSync和FairSync,分別原來(lái)實(shí)現(xiàn)非公平鎖和公平鎖晾匠。我們可以在創(chuàng)建ReentrantLock對(duì)象時(shí)茶袒,來(lái)設(shè)置鎖的公平性。

給構(gòu)造函數(shù)傳入true為公平鎖凉馆,傳入false為非公平鎖薪寓。不穿默認(rèn)情況下為非公平鎖。

ReentrantReadWirteLock中也有類似的方法澜共,不過(guò)ReentrantReadWirteLock并沒(méi)有實(shí)現(xiàn)lock接口向叉,而是實(shí)現(xiàn)了ReadWirteLock接口。

4嗦董、讀寫鎖

讀寫鎖將對(duì)一個(gè)資源的訪問(wèn)分為2個(gè)鎖母谎,即一個(gè)讀鎖,一個(gè)寫鎖京革。

正因?yàn)橛辛俗x寫鎖奇唤,才使得多個(gè)線程之間的讀操作不會(huì)發(fā)生沖突幸斥。

ReadWirteLock就是讀寫鎖,它是一個(gè)接口咬扇,ReentrantReadWirteLock實(shí)現(xiàn)了這個(gè)接口甲葬。

可以通過(guò)readLock()獲取讀鎖,通過(guò)wirteLock()獲取寫鎖懈贺。

5经窖、自旋鎖

首先是一種鎖,與互斥鎖相似梭灿,基本作用是用于線程之間的同步画侣。與普通鎖不同的是,一個(gè)線程A在獲得普通鎖后堡妒,如果再有其他線程B來(lái)試圖獲取鎖配乱,那么這個(gè)線程B將會(huì)掛起(阻塞);試想下,如果2個(gè)線程資源競(jìng)爭(zhēng)不是很激烈皮迟,而處理器阻塞一個(gè)線程引起的線程上下文切換的代價(jià)可能高于線程等待資源代價(jià)的時(shí)候宪卿,那么線程B可以不放棄cpu時(shí)間片,而是在原地忙等万栅,直到鎖的持有線程釋放了這個(gè)鎖佑钾。這就是自旋鎖的原理,可見(jiàn)自旋鎖是一種非阻塞鎖烦粒。

自旋鎖可能引起的問(wèn)題休溶?

1.過(guò)多占據(jù)cpu時(shí)間:如果鎖的持有者長(zhǎng)時(shí)間不釋放該鎖,那么等待線程將會(huì)長(zhǎng)時(shí)間的占據(jù)cpu的時(shí)間片扰她,導(dǎo)致cpu資源浪費(fèi)兽掰,因此,可以設(shè)定一個(gè)時(shí)間徒役,若超過(guò)這個(gè)時(shí)間孽尽,鎖還未釋放,那么等待者放棄cpu時(shí)間片進(jìn)入阻塞忧勿。

2.死鎖問(wèn)題:有一個(gè)線程連續(xù)2次試圖獲得自旋鎖杉女,當(dāng)?shù)谝淮潍@得自旋鎖后,改線程又試圖獲取自旋鎖鸳吸,此時(shí)檢測(cè)到鎖被占用(其實(shí)是被自己占用)熏挎,那么這時(shí),該線程會(huì)一直等待自己釋放改鎖晌砾,而不能繼續(xù)執(zhí)行坎拐,這樣就引起了死鎖。因此,使用自旋鎖時(shí)程序絕不能在持有自旋鎖時(shí)調(diào)用它自己哼勇,也絕不能在遞歸調(diào)用時(shí)試圖獲取相同的自旋鎖都伪。


6、樂(lè)觀鎖/悲觀鎖

樂(lè)觀鎖與悲觀鎖不是具體什么類型的鎖积担,而是指看待并發(fā)同步的角度院溺。

悲觀鎖認(rèn)為對(duì)于同一個(gè)數(shù)據(jù)的并發(fā)操作,一定是會(huì)發(fā)生修改的磅轻,哪怕沒(méi)有修改,也會(huì)認(rèn)為修改逐虚。因此對(duì)于同一個(gè)數(shù)據(jù)的并發(fā)操作聋溜,悲觀鎖采取加鎖的形式。悲觀的認(rèn)為叭爱,不加鎖的操作一定會(huì)出問(wèn)題的撮躁。

樂(lè)觀鎖則認(rèn)為對(duì)同一個(gè)數(shù)據(jù)的并發(fā)操作,是不會(huì)發(fā)生修改的买雾。在更新數(shù)據(jù)的時(shí)候把曼,會(huì)采用嘗試更新,不斷重新的方式來(lái)更新數(shù)據(jù)鲫咽。樂(lè)觀的認(rèn)為屹篓,不加鎖的并發(fā)操作是沒(méi)有事情的寝优。

從上述我們可以看出,悲觀鎖適合寫操作非常多的場(chǎng)景叙赚,樂(lè)觀鎖適合讀操作非常多的場(chǎng)景,不加鎖會(huì)帶來(lái)大量的性能提升僚饭。

悲觀鎖在java中的使用震叮,就是利用各種鎖。

樂(lè)觀鎖在java中的使用鳍鸵,就是無(wú)鎖編程苇瓣,常常采用的是CAS算法,典型的例子就是原子類偿乖,通過(guò)CAS自旋實(shí)現(xiàn)原子操作的更新击罪。

7、偏向鎖/輕量級(jí)鎖/重量級(jí)鎖

這3種鎖是指鎖的狀態(tài)贪薪,并且是針對(duì)synchronized鎖外邓。在java5通過(guò)鎖升級(jí)機(jī)制來(lái)實(shí)現(xiàn)高性能synchronized。這3月種鎖的狀態(tài)是通過(guò)對(duì)象監(jiān)視器在對(duì)象頭中的字段來(lái)表明的古掏。

偏向鎖是指一段同步代碼塊一直被同一個(gè)線程訪問(wèn)损话,那么該線程會(huì)自動(dòng)獲取鎖,降低獲取鎖的代價(jià)。

輕量級(jí)鎖是指當(dāng)鎖為偏向鎖的時(shí)候丧枪,被另一個(gè)線程訪問(wèn)光涂,偏向鎖就會(huì)升級(jí)為輕量級(jí)鎖,其他線程會(huì)通過(guò)自旋的方式來(lái)獲取鎖拧烦,不會(huì)阻塞忘闻,提高性能。

重量級(jí)鎖是指當(dāng)鎖為輕量級(jí)鎖的時(shí)候恋博,另一個(gè)線程雖然為自旋齐佳,但自旋不會(huì)一直持續(xù)下去,當(dāng)自旋到一定次數(shù)之后债沮,還沒(méi)有獲取到鎖炼吴,就會(huì)進(jìn)入阻塞,該鎖膨脹為重量級(jí)鎖疫衩。重量級(jí)鎖會(huì)讓其他申請(qǐng)的線程進(jìn)入阻塞硅蹦,降低性能。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末闷煤,一起剝皮案震驚了整個(gè)濱河市童芹,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌鲤拿,老刑警劉巖假褪,帶你破解...
    沈念sama閱讀 217,542評(píng)論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異近顷,居然都是意外死亡嗜价,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,822評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門幕庐,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)久锥,“玉大人,你說(shuō)我怎么就攤上這事异剥∩桑” “怎么了?”我有些...
    開(kāi)封第一講書人閱讀 163,912評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵冤寿,是天一觀的道長(zhǎng)歹苦。 經(jīng)常有香客問(wèn)我,道長(zhǎng)督怜,這世上最難降的妖魔是什么殴瘦? 我笑而不...
    開(kāi)封第一講書人閱讀 58,449評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮号杠,結(jié)果婚禮上蚪腋,老公的妹妹穿的比我還像新娘丰歌。我一直安慰自己,他們只是感情好屉凯,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,500評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布立帖。 她就那樣靜靜地躺著,像睡著了一般悠砚。 火紅的嫁衣襯著肌膚如雪晓勇。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書人閱讀 51,370評(píng)論 1 302
  • 那天灌旧,我揣著相機(jī)與錄音绑咱,去河邊找鬼。 笑死枢泰,一個(gè)胖子當(dāng)著我的面吹牛描融,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播宗苍,決...
    沈念sama閱讀 40,193評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼薄榛!你這毒婦竟也來(lái)了讳窟?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書人閱讀 39,074評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤敞恋,失蹤者是張志新(化名)和其女友劉穎丽啡,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體硬猫,經(jīng)...
    沈念sama閱讀 45,505評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡补箍,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,722評(píng)論 3 335
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了啸蜜。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片坑雅。...
    茶點(diǎn)故事閱讀 39,841評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖衬横,靈堂內(nèi)的尸體忽然破棺而出裹粤,到底是詐尸還是另有隱情,我是刑警寧澤蜂林,帶...
    沈念sama閱讀 35,569評(píng)論 5 345
  • 正文 年R本政府宣布遥诉,位于F島的核電站,受9級(jí)特大地震影響噪叙,放射性物質(zhì)發(fā)生泄漏矮锈。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,168評(píng)論 3 328
  • 文/蒙蒙 一睁蕾、第九天 我趴在偏房一處隱蔽的房頂上張望苞笨。 院中可真熱鬧,春花似錦、人聲如沸猫缭。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 31,783評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)猜丹。三九已至芝加,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間射窒,已是汗流浹背藏杖。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 32,918評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留脉顿,地道東北人蝌麸。 一個(gè)月前我還...
    沈念sama閱讀 47,962評(píng)論 2 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像艾疟,于是被迫代替她去往敵國(guó)和親来吩。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,781評(píng)論 2 354

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