上面这个问题是一个在Java面试中关于锁比较常见的一个问题,我大概总结了以下几点。
(1)sychronized 是一个关键字,我们既可以定义在方法上,也可以定义在方法内部;
而 ReentrantLock 是接口 Lock 的一个实现类。
(2)sychronized 会自动的加锁和释放锁;
ReentrantLock 需要程序员手动lock()加锁和unlock()释放锁。
(3)sychronized 底层是JVM层面的锁;
ReentrantLock 是API层面的锁,它是 Lock 接口的实现类。
(4)sychronized是非公平锁;
ReentrantLock可以选择公平锁或非公平锁。
(5)sychronized 锁的是对象,如果定义在方法上,当方法不是静态方法时,锁对象指的是 this,即指代当前调用者;当方法是静态方法时,所对象指的是当前类的字节码文件对象。锁信息保存在对象头中;
ReentrantLock 通过代码中的 int 类型的 state 标识来标志锁的状态。
(6)sychronized的执行效率略低于ReentrantLock锁,在jdk1.6后,引入锁分级策略,效率差距拉 低,只有大约20%;
ReentrantLock执行效率高,功能全,但是使用复杂;
(7)sychronized底层有一个锁升级的过程,优化了效率低的问题。