一些"锁"事

# synchronized与ReentrantLock比较

  • 锁的实现 synchronized是JVM实现的,ReentrantLock是JDK实现的

  • 性能 新版本Java对synchronized做了优化,比如适应性自旋、锁偏向、轻量级锁,性能与ReentrantLock相当。

  • 等待可中断 ReentrantLock可以设置获取锁的等待时间,synchronized不行。

  • 锁绑定条件 ReentrantLock可以通过Condition绑定多个对象。

  • 公平性 synchronized是非公平的,Reentrant可以设置公平还是非公平。

synchronized锁对象不能为空,因为锁信息记录在对象头中。

除非需要使用 ReentrantLock 的高级功能,否则优先使用 synchronized。这是因为 synchronized 是 JVM 实现的一种锁机制,JVM 原生地支持它,而 ReentrantLock 不是所有的 JDK 版本都支持。并且使用 synchronized 不用担心没有释放锁而导致死锁问题,因为 JVM 会确保锁的释放

# JVM中锁的优化

JVM中monitorenter和monitorexit字节码依赖于底层的操作系统的Mutex Lock来实现的,但是由于使用Mutex Lock需要将当前线程挂起并从用户态切换到内核态来执行,这种切换的代价是非常昂贵的;然而在现实中的大部分情况下,同步方法是运行在单线程环境(无锁竞争环境)如果每次都调用Mutex Lock那么将严重的影响程序的性能。不过在jdk1.6中对锁的实现引入了大量的优化,如锁粗化(Lock Coarsening)、锁消除(Lock Elimination)、轻量级锁(Lightweight Locking)、偏向锁(Biased Locking)、适应性自旋(Adaptive Spinning)等技术来减少锁操作的开销。

# 公平锁与非公平锁

主要区别是,当线程发现可以抢占锁时,是立即抢占,还是进入等待队列,唤醒队首的线程。

非公平锁可以减少线程切换次数,提高性能。但是可能出现不断有新线程获取锁,老线程始终等待的“锁饥饿”情况。

上次更新: 2023/04/09, 16:34:32
最近更新
01
go-admin-ui项目仿写练手1-登录页
06-29
02
maven依赖问题
06-17
03
JVM相关命令
02-21
更多文章>