引入
在Java高併發場景下,主要使用是三種鎖synchronized
、StampedLock
、Lock
比較
synchronized | StampedLock | Lock |
---|---|---|
是JVM的的內置鎖,每個JDK版本都會優化 | 是一個Java類,可以更好的擴展 | 是一個Java類,可以更好的擴展 |
都是悲觀鎖 | 提供了寫的樂觀鎖 | 都是悲觀鎖,但是提供了自旋鎖,或者不阻塞的獲取鎖 |
性能一般,因爲有一個從用戶態到內核態的過程 | 性能最好,可以代替讀寫鎖 | 性能十分不穩定,在複雜的讀寫環境下,性能十分差 |
不具有公平鎖 | 不具有公平鎖 | 具有公平鎖 |
鎖會自動釋放 | 鎖需要手動釋放 | 鎖需要手動釋放 |
總結
StampedLock
是性能最好的,可以勝任複雜的讀寫多線程環境- 令人驚奇的是
synchronized
,由於是內置鎖,每個JDK版本都會優化,尤其在複雜的讀寫多線程情況下,表現依然很優秀。 Lock
雖然提供了讀寫鎖,但是性能特別差;而ReentrantLock
性能十分好,同時功能豐富
個人推薦:如果時讀寫環境,推薦使用StampedLock
;如果是正常的加鎖,推薦使用synchronized
;如果需要對鎖有更多的控制,推薦使用ReentrantLock