想追女神?先學(xué) Synchronized 吧

在之前的《從找對(duì)象到多線程》一文中我曾介紹了一些和多線程有關(guān)的知識(shí)嚎货,而談到多線程橘霎,就一定離不開「鎖」這個(gè)名詞。在 Java 中殖属,鎖的使用主要有兩種:Synchronized 關(guān)鍵字和 Lock 接口姐叁,本文將會(huì)換個(gè)角度來聊一聊 synchronized 中的鎖。

Synchronized 用的鎖是存在對(duì)象頭里的洗显,用來表明當(dāng)前對(duì)象所持有的鎖外潜。在 Java SE1.6 之前,Synchronized 是作為重量鎖出現(xiàn)的挠唆,一旦使用了 synchronized处窥,就一定會(huì)阻塞到其他線程。而在 Java SE1.6 后玄组,為了減少獲得鎖和釋放鎖帶來的性能問題滔驾,引入了"偏向鎖"和"輕量鎖"的概念。由此可以得知俄讹,在新的 Java 中哆致,鎖一共有 4 種狀態(tài):無鎖狀態(tài)、偏向鎖狀態(tài)患膛、輕量鎖狀態(tài)和重量鎖狀態(tài)摊阀。這幾個(gè)狀態(tài)會(huì)隨著競(jìng)爭(zhēng)不斷升級(jí)且只能升級(jí)不能降級(jí),即輕量鎖只會(huì)升級(jí)到重量鎖而不會(huì)降級(jí)到偏向鎖踪蹬。

以上的解釋未免太過官方了驹溃,我們從一個(gè)小例子入手。

我們用女神來表示同步代碼塊延曙,就好比女神有很多追求者豌鹤,同步代碼塊也會(huì)被很多線程執(zhí)行。有一天女神的微博狀態(tài)變成了「單身」枝缔,此時(shí)她就處于無鎖狀態(tài)布疙,于是這些追求者紛紛創(chuàng)建了一個(gè)名為「找對(duì)象」的線程,此時(shí)對(duì)于女神(對(duì)象)來說愿卸,還沒有任何線程來訪問她灵临,所以當(dāng)?shù)谝粋€(gè)男生小 A 試圖邀請(qǐng)她看電影的時(shí)候(獲取鎖),她會(huì)偏向小 A 的邀請(qǐng)趴荸,此時(shí)她就是處于「偏向鎖」?fàn)顟B(tài)的儒溉。有了這次經(jīng)歷之后,小 A 就知道該怎么邀請(qǐng)女神而不用反復(fù)試探了发钝,這就是「可重入鎖」顿涣,即同一個(gè)線程可以多次訪問同一代碼塊波闹。

再后來女神發(fā)了一條微博,說今天和這個(gè)男生看電影很開心涛碑。這條微博被其他男生看見了精堕,大家也都知道了女神這個(gè)對(duì)象的偏向狀態(tài)了∑颜希可還是有男生小 B 想追女神歹篓,此時(shí)這兩個(gè)男生各自「找對(duì)象」的線程就在女神這個(gè)對(duì)象上產(chǎn)生了競(jìng)爭(zhēng)

小 B 一直關(guān)注女神的微博動(dòng)態(tài)揉阎,他心想著庄撮,只要小 A 被女神拒絕了,女神就會(huì)變成「無鎖」?fàn)顟B(tài)毙籽,自己也就有機(jī)會(huì)被女神偏向了重窟。女神也知道小 B 在追自己,為了找到最合適的另一半惧财,女神也在暗中觀察小 B,有兩個(gè)競(jìng)爭(zhēng)者同時(shí)競(jìng)爭(zhēng)扭仁,這時(shí)候她就處于「輕量鎖」的狀態(tài)垮衷。雖然女神明顯更喜歡小 A,但在小 B 心里覺得小 A 除了比自己早點(diǎn)出現(xiàn)外根本不具有和自己競(jìng)爭(zhēng)的能力乖坠,于是不斷給女神獻(xiàn)殷勤搀突,保持關(guān)系,這就叫自旋熊泵,不斷的將自己的時(shí)間花費(fèi)在獲取鎖上仰迁,逐漸成為一條舔 ??。

雖然一開始女神也會(huì)偶爾答應(yīng)小 B 的邀請(qǐng)顽分,但當(dāng)競(jìng)爭(zhēng)者越來越多后徐许,小 B 變得瘋狂起來,追求逐漸變成了騷擾卒蘸,女神也逐漸不耐煩起來雌隅。最終在小 A 的努力下,女神和小 A 確定了關(guān)系缸沃,并發(fā)了微博告知眾人恰起,此時(shí)她的狀態(tài)就升級(jí)成為「重量鎖」?fàn)顟B(tài)。這時(shí)趾牧,除了小 A检盼,其他所有競(jìng)爭(zhēng)者的「找對(duì)象」線程都沒有辦法再追求女神了。這樣做的好處就是趕緊斷了那些追求者的念頭翘单,讓他們可以早日覓得其他良人吨枉,不要在一棵樹上吊死蹦渣。

從線程的角度來看,重量鎖使除了擁有鎖的線程外的其他所有線程都阻塞东羹,這樣可以有效防止 CPU 空轉(zhuǎn)剂桥,避免造成資源的浪費(fèi)。

在偏向鎖和輕量鎖階段属提,女神還沒有和任何人確定關(guān)系权逗,只要給點(diǎn)甜頭小 B 等其他追求者都會(huì)很開心,這是一種「樂觀鎖」冤议。而一旦女神和小 A 確定了關(guān)系斟薇,自身狀態(tài)升級(jí)為重量鎖后,小 B 就很不開心了恕酸,對(duì)他來說這就是一種「悲觀鎖」堪滨。

當(dāng)然,上面所說的樂觀鎖和悲觀鎖只是為了方便大家的記憶蕊温,實(shí)際的定義并不是這樣袱箱。

所謂悲觀鎖(Pessimistic Lock),顧名思義义矛,就是很悲觀发笔,每次去拿數(shù)據(jù)的時(shí)候都認(rèn)為別人會(huì)修改。所以每次在拿數(shù)據(jù)的時(shí)候都會(huì)上鎖凉翻,這樣別人想拿這個(gè)數(shù)據(jù)就會(huì) block 直到它拿到鎖了讨。悲觀鎖假定會(huì)發(fā)生并發(fā)沖突,因此屏蔽一切可能違反數(shù)據(jù)完整性的操作制轰。就跟上面的例子中前计,女神已有男朋友之后就不會(huì)再答應(yīng)其他男生的邀約類似。

而樂觀鎖(Optimistic Lock)垃杖,顧名思義男杈,就是很樂觀,每次去拿數(shù)據(jù)的時(shí)候都認(rèn)為別人不會(huì)修改调俘,所以不會(huì)上鎖势就,但是在提交更新的時(shí)候會(huì)判斷一下在此期間別人有沒有去更新這個(gè)數(shù)據(jù)。

想到這脉漏,我不禁開始懷疑 Synchronized 的設(shè)計(jì)者是不是經(jīng)歷過類似的事情苞冯,不然為什么會(huì)這么熟練。只是不知道他究竟是那個(gè)線程還是被鎖起來的對(duì)象侧巨。

以上就是本文的全部?jī)?nèi)容了舅锄,如果你覺得本文對(duì)你有所幫助,不妨點(diǎn)個(gè)關(guān)注支持一波司忱,也歡迎大家在下方評(píng)論區(qū)留言??

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末皇忿,一起剝皮案震驚了整個(gè)濱河市畴蹭,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌鳍烁,老刑警劉巖叨襟,帶你破解...
    沈念sama閱讀 217,734評(píng)論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異幔荒,居然都是意外死亡糊闽,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,931評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門爹梁,熙熙樓的掌柜王于貴愁眉苦臉地迎上來右犹,“玉大人,你說我怎么就攤上這事姚垃∧盍矗” “怎么了?”我有些...
    開封第一講書人閱讀 164,133評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵积糯,是天一觀的道長(zhǎng)掂墓。 經(jīng)常有香客問我,道長(zhǎng)看成,這世上最難降的妖魔是什么君编? 我笑而不...
    開封第一講書人閱讀 58,532評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮绍昂,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘偿荷。我一直安慰自己窘游,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,585評(píng)論 6 392
  • 文/花漫 我一把揭開白布跳纳。 她就那樣靜靜地躺著忍饰,像睡著了一般。 火紅的嫁衣襯著肌膚如雪寺庄。 梳的紋絲不亂的頭發(fā)上艾蓝,一...
    開封第一講書人閱讀 51,462評(píng)論 1 302
  • 那天,我揣著相機(jī)與錄音斗塘,去河邊找鬼赢织。 笑死,一個(gè)胖子當(dāng)著我的面吹牛馍盟,可吹牛的內(nèi)容都是我干的于置。 我是一名探鬼主播,決...
    沈念sama閱讀 40,262評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼贞岭,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼八毯!你這毒婦竟也來了搓侄?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,153評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤话速,失蹤者是張志新(化名)和其女友劉穎讶踪,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體泊交,經(jīng)...
    沈念sama閱讀 45,587評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡乳讥,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,792評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了活合。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片雏婶。...
    茶點(diǎn)故事閱讀 39,919評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖白指,靈堂內(nèi)的尸體忽然破棺而出留晚,到底是詐尸還是另有隱情,我是刑警寧澤告嘲,帶...
    沈念sama閱讀 35,635評(píng)論 5 345
  • 正文 年R本政府宣布错维,位于F島的核電站,受9級(jí)特大地震影響橄唬,放射性物質(zhì)發(fā)生泄漏赋焕。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,237評(píng)論 3 329
  • 文/蒙蒙 一仰楚、第九天 我趴在偏房一處隱蔽的房頂上張望隆判。 院中可真熱鬧,春花似錦僧界、人聲如沸侨嘀。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,855評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)咬腕。三九已至,卻和暖如春葬荷,著一層夾襖步出監(jiān)牢的瞬間涨共,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,983評(píng)論 1 269
  • 我被黑心中介騙來泰國(guó)打工宠漩, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留举反,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,048評(píng)論 3 370
  • 正文 我出身青樓扒吁,卻偏偏與公主長(zhǎng)得像照筑,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,864評(píng)論 2 354

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