有人说:轻量级锁一定比重量级锁快!我忍不住笑了
世界上不止有黑白兩色,黑與白之間還是灰色的地帶。
在成人的世界里,大多數(shù)人喜歡非黑即白的觀點來看待一個問題,例如《十二公民》中那個剛開始所有人都認定的“一定是富二代殺S了自己的親身父親”,到最后大家理性分析和推測之后發(fā)現(xiàn),事情根本不是大多數(shù)人(99.9%)以為的那樣。
我們很容易被他人的說辭所誤導,相信我們愿意相信的事,聽我們愿意聽的事,然后被輿論所支配,在人云亦云之中漸漸的迷失自我,然后喪失自己獨立思考的能力。
學技術(shù)也是一樣,盡信書不如無書,思考才是學習的目的,如果讀書不是為了啟迪自己的智慧,只是為了吹NB,那這個人有很大的概率會一事無成。
那此時我們再回過頭來思考這個問題:輕量級鎖一定比重量級鎖快嗎?
正文
在回答這個問題之前,我們先來了解一下:什么是輕量級鎖?什么是重量級鎖?
鎖概念
輕量級鎖是 JDK 1.6 新增的概念,是相對于傳統(tǒng)的重量級鎖而已的一種狀態(tài),在 JDK 1.5 時,synchronized 是需要通過操作系統(tǒng)自身的互斥量(mutex lock)來實現(xiàn),然而這種實現(xiàn)方式需要通過用戶態(tài)與和核心態(tài)的切換來實現(xiàn),但這個切換的過程會帶來很大的性能開銷,所以在 JDK 1.6 就引入了輕量級鎖來避免此問題的發(fā)生。
輕量級鎖執(zhí)行過程
再講輕量級鎖執(zhí)行過程之前,要先從虛擬機的對象頭開始說起,HotSpot 的對象頭(Object Header)分為兩部分:
Mark Word 區(qū)域,用于存儲對象自身的運行時數(shù)據(jù),如哈希碼(HashCode)、GC 分帶年齡等;
用于存儲指向方法區(qū)對象類型數(shù)據(jù)的指針(如果是數(shù)組對象的話,還有一個存儲數(shù)組長度的額外信息)。
Mark Word 在 32 位系統(tǒng)中,有 32bit 空間,其中:
25bit 用來存儲 HashCode;
4bit 用來存儲對象的分帶年齡;
2bit 用來存儲鎖標志位,01=可偏向鎖、00=輕量級鎖、10=重量級鎖;
1bit 固定為 0。
再說會輕量級鎖的執(zhí)行過程,在代碼進入同步塊的時候,如果此對象沒有被線程所占用,虛擬機會先將此線程的棧幀拷貝一份存儲在當前對象的 Lock Record (鎖記錄)?區(qū)域中。
然后虛擬機再使用 CAS (Compare and Swap, 比較并交換)?將本線程的 Mark Word 更新為指向?qū)ο?Lock Record 區(qū)域的指針,如果更新成功,則表示這個線程擁有了該對象,輕量級鎖添加成功,如果更新失敗,虛擬機會先檢查對象 Mark Word 是否指向了當前線程的線幀,如果是則表明此線程已經(jīng)擁有了此鎖,如果不是,則表明該鎖已經(jīng)被其他線程占用了。如果有兩條以上的線程在爭搶死鎖,那么鎖就會膨脹為重量鎖,Mark Word 中存儲的就是指向重量級鎖的互斥量指針,后面等待鎖的線程也會進入阻塞狀態(tài)。
從以上的過程,我們可以看出輕量級鎖可以理解為是通過 CAS 實現(xiàn)的,理想的情況下是整個同步周期內(nèi)不存在鎖競爭,那么輕量鎖可以有效的提高程序的同步性能,然而,如果情況相反,輕量級鎖不但要承擔 CAS 的開銷還要承擔互斥量的開銷,這種情況下輕量級鎖就會比重量級鎖更慢,這就是我們本文的答案。
總結(jié)
輕量級鎖不是在任何情況下都比重量級鎖快的,要看同步塊執(zhí)行期間有沒有多個線程搶占資源的情況,如果有,那么輕量級線程要承擔 CAS +?互斥量鎖的性能消耗,就會比重量鎖執(zhí)行的更慢。
關(guān)于好與壞和對于錯也是這個道理,有些事今天可能是對的,但明天有可能成錯的了。比如 JDK 1.5 時,你可以說同步線程只有一個方式:synchronized,然而 JDK 1.6 時又添加了 Lock。你昨天說的對的話,在明天可能就變成錯的了。所以對和錯其實并不是那么絕對,它也沒那么重要,重要的是你得有獨立思考的能力和辨識對錯認知。
【END】
近期熱文
HashMap 為什么會導致 CPU 100%?面試突擊 006 期
面試突擊 005 | Redis 是如何實現(xiàn)高可用的?它的實現(xiàn)方式有哪些?
面試突擊 004 | 如何排查 Redis 中的慢查詢?視頻實戰(zhàn)篇
面試突擊 003 | Redis 如何實現(xiàn)查詢附近的人?
面試突擊 002 | Redis 是如何處理已過期元素的?
面試突擊 001 | Redis 如何從海量數(shù)據(jù)中查詢出某一個 Key?
關(guān)注下方二維碼,訂閱更多精彩內(nèi)容
朕已閱?
總結(jié)
以上是生活随笔為你收集整理的有人说:轻量级锁一定比重量级锁快!我忍不住笑了的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Xamarin开发笔记—百度在线语音合成
- 下一篇: 优秀的代码原来是这样分层的