1、synchronized是JVM层次的锁实现,ReentrantLock是JDK层次的锁实现;
2、synchronized的锁状态是无法在代码中直接判断的,但是ReentrantLock可以通过ReentrantLock#isLocked判断;
3、synchronized是非公平锁,ReentrantLock是可以是公平也可以是非公平的;
4、synchronized是不可以被中断的,而ReentrantLock#lockInterruptibly方法是可以被中断的;
5、在发生异常时synchronized会自动释放锁,而ReentrantLock需要开发者在finally块中显示释放锁;
ReentrantLock获取锁的形式有多种:如立即返回是否成功的tryLock(),以及等待指定时长的获取,更加灵活;
6、synchronized在特定的情况下对于已经在等待的线程是后来的线程先获得锁(回顾一下sychronized的唤醒策略),而ReentrantLock对于已经在等待的线程是先来的线程先获得锁;