相同点
1、两者都可以控制多线程对共享对象的访问。
2、都是可重入锁。
3、都可以保证可见性和互斥性。
不同点
1、ReentrantLock显式的获得锁和释放锁;sychronized隐式的获得锁和释放锁。并且为了避免在出现异常时能够正常的释放锁,在使用ReentrantLock的时候需要在finally语句块中进行锁的释放。
2、ReentrantLock可以定义公平锁。
3、ReentrantLock可以响应中断,可轮回,为处理锁提供了更多的灵活性。
4、ReentrantLock是API级别的,sychronized是JVM级别的。
5、Lock是一个接口,sychronized是Java中的一个关键字,sychronized由内置语言实现
6、二者底层实现不一样,sychronized是同步阻塞;Lock(可以)是同步非阻塞(因为有tryLock()方法)。
7、我们通过Lock可以知道获取锁有没有成功,但是sychronized却不可以。
8、Lock可以分别定义读写锁来提高多线程读操作的效率。
9、ReentrantLock通过Condition可以绑定多个条件。