相同点:

首先,都是可重入锁。就是外部函数获取锁之后,内部函数仍然可以获取锁。

其次,都保证了可见性和互斥性。可见性就是同一变量的修改对不同线程可见。互斥性就是指资源只能由一个线程持有。

最后,都可以用于多线程情况下的编程。

不同点:

从锁的可中断性来说,ReentrantLock等待可中断。

从锁的公平性来说,两者都是非公平的。但是ReentrantLock配置成为公平的。

从绑定条件数量上说,ReentrantLock可以是多个条件。

从实现原理上说,synchronized是JVM级别的。ReentrantLock是一个Lock接口下的实现类。

从获取锁、释放锁的方式上说,synchronized是隐式的。ReentrantLock是显示的,在发生异常时,需要手动释放锁。