自旋鎖
自旋鎖顧名思義,它會等待一定時間(自旋),在這期中會什么都不做就是等資源被釋放,好處在於沒有了內核態用戶態切換的效率損失,但是如果它一直不能訪問到資源的話就會一直占用cpu資源,所以它會循環一段時間后進入阻塞狀態。
重量級鎖
synchronized就是重量級鎖的實現機制,搶不到資源的進程會進入阻塞狀態
偏向鎖
顧名思義,它會偏向第一個訪問資源的進程,如果說只有一個進程執行同步代碼塊,那么就會上個偏向鎖,如果有其他線程搶占資源,那么就會升級為輕量級鎖
輕量級鎖
偏向鎖升級之后就是輕量級鎖,鎖只可以升級而不可以降級。輕量級鎖中的其他進程會進入自選狀態,如果說自選失敗,就會升級會重量級鎖
(圖片來自他人博客)
公平,非公平鎖
主要是指線程是否先來后到拿到鎖,synchronized是非公平的,而ReentrantLock默認非公平,可以設置為公平鎖
悲觀鎖
總是假設最壞的情況,每次去拿數據的時候都認為別人會修改,所以每次在拿數據的時候都會上鎖,這樣別人想拿這個數據就會阻塞直到它拿到鎖(共享資源每次只給一個線程使用,其它線程阻塞,用完后再把資源轉讓給其它線程)。傳統的關系型數據庫里邊就用到了很多這種鎖機制,比如行鎖,表鎖等,讀鎖,寫鎖等,都是在做操作之前先上鎖。Java中synchronized
和ReentrantLock
等獨占鎖就是悲觀鎖思想的實現。
樂觀鎖
總是假設最好的情況,每次去拿數據的時候都認為別人不會修改,所以不會上鎖,但是在更新的時候會判斷一下在此期間別人有沒有去更新這個數據,可以使用版本號機制(數據庫中)和CAS算法實現