引入
在Java高并发场景下,主要使用是三种锁synchronized
、StampedLock
、Lock
比较
synchronized | StampedLock | Lock |
---|---|---|
是JVM的的内置锁,每个JDK版本都会优化 | 是一个Java类,可以更好的扩展 | 是一个Java类,可以更好的扩展 |
都是悲观锁 | 提供了写的乐观锁 | 都是悲观锁,但是提供了自旋锁,或者不阻塞的获取锁 |
性能一般,因为有一个从用户态到内核态的过程 | 性能最好,可以代替读写锁 | 性能十分不稳定,在复杂的读写环境下,性能十分差 |
不具有公平锁 | 不具有公平锁 | 具有公平锁 |
锁会自动释放 | 锁需要手动释放 | 锁需要手动释放 |
总结
StampedLock
是性能最好的,可以胜任复杂的读写多线程环境- 令人惊奇的是
synchronized
,由于是内置锁,每个JDK版本都会优化,尤其在复杂的读写多线程情况下,表现依然很优秀。 Lock
虽然提供了读写锁,但是性能特别差;而ReentrantLock
性能十分好,同时功能丰富
个人推荐:<mark>如果时读写环境,推荐使用StampedLock
;如果是正常的加锁,推荐使用synchronized
;如果需要对锁有更多的控制,推荐使用ReentrantLock
</mark>