Synchronized 和 ReentrantLock 的区别
共同点:
- 都是用来协调多线程对共享变量、对象的访问
- 都是可重入锁,同一线程可以多次获取同一个锁
- 都保证了可见性和互斥性
不同点:
- ReentrantLock 显式的获取锁,释放锁;Synchronized 隐式的获取、释放锁
- ReentrantLock 可响应中断、可轮回;synchronized 是不可以响应中断的,为处理锁的不可用性提供了更高的灵活性
- ReentrantLock 是 API 级别的;synchronized 是 JVM 级别的
- ReentrantLock 可以实现公平锁
- ReentrantLock 通过 Condition 可以绑定多个条件
- 底层实现不一样,synchronized 是同步阻塞,使用的是悲观并发策略,lock 是同步非阻塞,采用的是乐观并发策略
- Lock 是一个借口,而 synchronized 是 Java 中的关键字, synchronized 是内置的语言实现
- synchronized 在发生异常时,会自动释放线程占有的锁,因此不会导致死锁现象发生;而 lock 在发生异常时,如果没有主动通过 unLock() 去释放锁,则很可能造成死锁现象,因此使用 Lock 时需要在 finally 块中释放锁
- 通过 Lock 可以知道有没有成功获取锁,而 synchronized 缺无法办到
- Lock 可以提高多个线程进行读操作的效率,即就是实现读写锁等

浙公网安备 33010602011771号