在JDK1.6之後,爲了減小消耗,鎖進行了不少的升級。而且有了四種狀態,從低到高git
不一樣等級間的鎖能夠進行升級,可是不能進行降級github
下面就介紹一下這四種不一樣等級的鎖spring
個人全部文章同步更新與Github--Java-Notes,想了解JVM(基本更完),HashMap源碼分析,spring相關,,併發,劍指offer題解(Java版),能夠點個star。能夠看個人github主頁,天天都在更新喲。多線程
邀請您跟我一同完成 repo併發
在講鎖以前咱們應該瞭解對象的內存佈局,由於後面鎖的斷定時須要用到,源碼分析
該內容能夠看個人這篇文章,對象的內存佈局,重點看對象頭中的運行時數據(Mark Word)佈局
看了這個你應該知道,Mark Word(之後簡稱MW) 會隨着 標誌位的變化而變化性能
先把他放出來,省得等會兒你本身翻線程
能夠看到,這種狀況下,MW被分爲了四個部分,他鎖的標誌位爲 01,是不是偏向鎖標誌位爲 0.3d
先看MW變化(在對象頭變化的那一張圖片中)
能夠看到,他的鎖標誌位和無鎖的標誌位是同樣的 都是 01,可是是不是偏向鎖的標誌位就變了 變成了 1.而且整個MW部分變成了5部分
通過研究發現,大多數狀況下,鎖不只不存在多線程競爭,並且老是由同一線程屢次得到,爲了讓線程得到鎖的代價更低而引人了偏向鎖
偏向鎖,就如同他的名字同樣,"偏向","偏愛",英文"biased"也是偏心的意思。
他爲啥是叫這個呢,由於這個鎖偏向於第一個獲取到他的線程,若是在接下來的執行過程當中,該鎖沒有被其餘的線程獲取,則持有偏向鎖的線程將永遠不須要再進行同步
上面一共被分爲三大部分,
上面的圖中,線程一演示了偏向鎖的初始化流程,線程2演示了偏向鎖撤銷的過程
標誌位爲"00",能夠看最開始的圖
爲啥叫輕量級鎖,由於這是相比於傳統的重量級鎖而言,原來傳統的重量級鎖,使用的是系統互斥量實現的
他的出現並非代替重量級鎖,而是在沒有多線程競爭的前提下,減小系統互斥量操做產生的性能消耗
先看圖
輕量級能提高程序同步性能的依據是"對於絕大部分的鎖,在整個同步週期內都是不存在競爭的",這是一個經驗數據。
鎖 | 優勢 | 缺點 | 適用場景 |
---|---|---|---|
偏向鎖 | 加鎖和解鎖都不須要額外的消耗,和執行非同步方法相比僅存在納秒級的差距 | 若是線程間存在鎖競爭,會帶來額外的鎖撤銷的消耗 | 只有一個線程訪問同步塊 |
輕量級鎖 | 競爭的線程不會阻塞,提升了程序的響應速度 | 若是始終得不到鎖競爭的線程,使用自旋會消耗CPU | 追求響應時間 同步塊執行速度很是塊 |
重量級鎖 | 線程競爭不使用自旋,不會消耗CPU | 線程阻塞,響應時間慢 | 追求吞吐量同步塊執行時間較長 |