共同点
- 都是用来协调多线程对共享对象、变量的访问
- 都是可重入锁,同一线程可以多次获得同一个锁
- 都保证了可见性和互斥性
不同点
- ReentrantLock显示的获得、释放锁,synchronized隐式获得释放锁
- ReentrantLock可响应中断,可轮回
- ReentrantLock是API级别的,synchronized是JVM级别的
- ReentrantLock可以实现公平锁,可以通过Condition绑定多个条件
- 底层实现不一样,synchronized是同步阻塞,使用的是悲观并发策略,lock是同步非阻塞,采用的是乐观并发策略
- synchronized在发生异常时,会自动释放线程占有的锁,因此不会导致死锁现象的发生;而lock在发生异常时,如果没有主动通过unlock()释放锁,很可能造成死锁现象。