synchronized的偏斜锁,轻量级锁,重量级锁
synchronized的偏斜鎖,輕量級鎖,重量級鎖
- synchronized重在哪里?
- JDK1.6之后synchronized發生了什么變化?
- 偏斜鎖(偏向鎖)
- 輕量級鎖
- 重量級鎖
- 參考
有關synchronized鎖升級的理念,很多博客講的很明白,在這里我將我個人的理解講述一下,方便各位的理解,如果有描述的不正確的地方還請多多指正,不勝感激。
synchronized 是 Java 內建的同步機制,所以也有人稱其為 Intrinsic Locking,它提供了互斥的語義和可見性,當一個線程已經獲取當前鎖時,其他試圖獲取的線程只能等待或者阻塞在那里。
synchronized重在哪里?
JDK1.6之前,使用synchronized來添加同步操作的話,synchronized會直接鎖上睜個代碼塊,當一個線程訪問來加鎖的資源時。其他的所有線程會進入堵塞隊列中堵塞。完事在一個一個的喚醒。而將線程堵塞和喚醒這個操作是需要操作系統的幫助,需要進行用戶態到內核態的切換。操作系統這個操作是非常慢的,重即重在這里。
JDK1.6之后synchronized發生了什么變化?
JDK1.6之后,整個synchronized操作會根據并發的情況來逐步的進行鎖升級。
偏斜鎖(偏向鎖)
如果被synchronized同步的對象,一直只有同一個線程來訪問。
那么會將這個線程id保存到這個對象的對象頭中,具體保存到對象頭中的一個叫做MarkWord的部分。表示對象偏向于這個線程。以后這個線程再來的話,一看到對象頭中有自己的線程id就會自動放行。這就是偏向鎖。
輕量級鎖
在偏斜鎖的情況下,如果有另一個線程也想訪問被synchronized同步的對象。那么線程會通過CAS的方式來嘗試將自己的線程id寫入到剛剛那個MarkWord中,如果寫入成功了,就會成功獲取鎖。
重量級鎖
剛剛CAS寫入的時候不成功會進行多次自旋,當超過一定次數,就會最終升級成重量級鎖,這個時候的操作就和早期jdk的synchronized一樣了,此時會調用操作系統的互斥鎖。當前線程會被阻塞住。
參考
synchronized底層如何實現?什么是鎖的升級、降級?: 鏈接.
總結
以上是生活随笔為你收集整理的synchronized的偏斜锁,轻量级锁,重量级锁的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ubuntu忘记mysql密码,怎么办
- 下一篇: 历届图灵奖得主及研究领域