Synchronized和ReentrantLock的区别
原理弄清楚了,顺便总结了几点Synchronized和ReentrantLock的区别:
- Synchronized是JVM层次的锁实现,ReentrantLock是JDK层次的锁实现;
- Synchronized的锁状态是无法在代码中直接判断的,但是ReentrantLock可以通过
ReentrantLock#isLocked
判断; - Synchronized是非公平锁,ReentrantLock是可以是公平也可以是非公平的;
- Synchronized是不可以被中断的,而
ReentrantLock#lockInterruptibly
方法是可以被中断的; - 在发生异常时Synchronized会自动释放锁(由javac编译时自动实现),而ReentrantLock需要开发者在finally块中显示释放锁;
- ReentrantLock获取锁的形式有多种:如立即返回是否成功的tryLock(),以及等待指定时长的获取,更加灵活;
- Synchronized在特定的情况下对于已经在等待的线程是后来的线程先获得锁,而ReentrantLock对于已经在等待的线程一定是先来的线程先获得锁;