相同点:
synchronized 和 ReentrantLock 都是 Java 中提供的可重入锁
不同点:
用法不同:synchronized 可以用来修饰普通方法、静态方法和代码块;ReentrantLock 只能用于代码块;
synchronized退出代码块就自动释放锁,reentrantlock必须手动加锁,手动释放锁,注意要用try-finally处理加锁和释放锁的代码
synchronized只支持非公平锁,reentrantlock支公平锁,也支持非公平锁,通过构造方法的参数指定
ReentrantLock可以根据不同的条件进行唤醒和休眠
synchronized在申请锁失败时,会一直等待锁资源,ReentrantLock可以通过trylock()等待一段时间就放弃
synchronized是JVM对锁的实现,最终通过调用cpu的加锁指令,ReentrantLock是java层面的JUC包中的一组实现类(底层实现不同:synchronized 是 JVM 层面通过监视器实现的;ReentrantLock 是基于 AQS 实现的。)