🔍 開發者資源導航 🔍 |
---|
🏷? 博客主頁: 個人主頁 |
📚 專欄訂閱: JavaEE全棧專欄 |
synchronized優化原理
synchronized即使悲觀鎖也是樂觀鎖,擁有自適應性。 jvm內部會統計每個鎖的競爭激烈程度,自動識別。
它在運行時主要有三種優化策略。
鎖升級
路徑:
無鎖->偏向鎖->自旋鎖->重量級鎖
如果對于這些概念不清楚可以參考這篇文章->點我
無鎖->偏向鎖
所謂偏向鎖就是進行一個簡單的標記,并不是真正的加鎖,這個標記非常的輕量,相對于加鎖高效的多。
如果到最后沒人和它競爭這個鎖,那么到最后只需要清除簡單的標記。
偏向鎖->自旋鎖
在偏向鎖的情況下遇到了鎖競爭,那么他會在其他線程加鎖之前對它先進行加自旋鎖的操作。
自旋鎖->重量級鎖
如果這個鎖的競爭情況非常激烈,就會對這個鎖升級到重量級鎖。
在jvm只提供了鎖升級,并沒有涉及鎖降級操作。
鎖消除:
編譯器優化的一種體現
編譯器會判定,當前的這個代碼邏輯是否真的需要加鎖,如果確實不需要加鎖,但是你寫了synchronized,就會自動去掉。
這個判定比較保守,只有100%確認這個代碼是單線程的時候才會觸發,當判斷不清楚的時候不會觸發,因此不會出現判斷邏輯錯誤導致的線程安全。
鎖粗化:
鎖的粒度:加鎖和解鎖之間,包含的代碼越多,就認為鎖的粒度越粗,如果越少,就認為越細。這里代碼指的是實際執行的指令/時間。
如果檢測到一連串連續的對同一個對象的加鎖和解鎖操作(即使沒有競爭),JVM 可能會將這些操作合并為一個更大范圍的加鎖,減少鎖的獲取和釋放次數,從而提高性能。
優化前(細粒度鎖,效率低)
synchronized (obj) {// 操作1
}
synchronized (obj) {// 操作2
}
synchronized (obj) {// 操作3
}
優化后(鎖粗化,合并為一個鎖)
synchronized (obj) { // JVM 可能會合并成一個鎖// 操作1// 操作2// 操作3
}
感謝各位的觀看Thanks?(・ω・)ノ,如果覺得滿意的話留個關注再走吧。