鎖的狀態總共有四種:無鎖狀態、偏向鎖、輕量級鎖和重量級鎖。
隨著鎖的競爭,鎖可以從偏向鎖公升級到輕量級鎖,再公升級的重量級鎖(但是鎖的公升級是單向的,也就是說只能從低到高公升級,不會出現鎖的降級)。
輕量級鎖並不是用來代替重量級鎖的,它的本意是在沒有多執行緒競爭的前提下,減少傳統的重量級鎖使用產生的效能消耗。
輕量級鎖所適應的場景是執行緒交替執行同步塊的情況,如果存在同一時間訪問同一鎖的情況,就會導致輕量級鎖膨脹為重量級鎖。
lock就是輕量級鎖,synchronized就是重量級鎖
synchronized
是通過物件內部的乙個叫做監視器鎖(monitor)來實現的。
但是監視器鎖本質又是依賴於底層的作業系統的mutex lock來實現的。
而作業系統實現執行緒之間的切換這就需要從使用者態轉換到核心態,這個成本非常高,狀態之間的轉換需要相對比較長的時間。
這就是為什麼synchronized效率低的原因。
lock相對於synchronized的好處是,效能消耗低,不需要用物件作為監視器,也就不容易發生死鎖
關於執行緒鎖
場景 alocker m 陣列m b 非同步方法 m newval b task.run var c m.n 段a中存在乙個非同步的方法,此時c獲取的不是當時的m值,而是m每次賦值後的新值 也就是每次獲取的都是m下一次的值 解決方法 1.將b方法寫成同步方法 2.將b方法所用到的m 被鎖住的 通過引...
關於執行緒鎖的相關
1.互斥鎖 遞迴鎖 linuxthreads只支援一種互斥體屬性 互斥體的型別,fast型別的互斥體值為pthread mutex fast np,recursive型別的互斥體值為pthread mutex recursive np,error checking型別的互斥體值為pthread mu...
關於鎖,多執行緒,同步
from 尚矽谷 zhouyang 1.乙個物件裡面如果有多個synchronized方法,某乙個時刻內,只要乙個執行緒去呼叫其中的乙個synchronized方法了,其它的執行緒都只能等待,換句話說,1.1 某乙個時刻內,只能有唯一乙個執行緒去訪問這些synchronized方法 鎖的是當前物件t...