首先,从使用成本来讲,synchronized的使用成本要比ReentrantLock低。
synchronized的使用,直接就是加到方法上,或者代码块上即可,加锁和解锁的这个操作,都是自动完成的,开发者不需要操作。
而ReentrantLock则要求开发者自己来控制,你自己new出来,自己去Lock,使用完成后再unLock解锁。
但是ReentrantLock在使用上,要更加的灵活一点,因为他可以由我们自己控制,所以他能实现一些额外的功能,比如查看锁的状态,尝试获取锁,获取不到就返回,再或者我可以让他在一定时间内自己重试去获取锁,这些synchronized是做不到的。
第二个方面,我们可以从底层实现讲一下。
synchronized是使用对象头来实现的,他会涉及到一个锁升级的过程,最终会升级为重量级锁(自己看情况展开说明)
而ReentrantLock是基于AQS来实现,抢锁的时候用CAS的方式来优化性能,抢不到则进入队列排队等待。
最后,从潜力上讲的话,synchronized会更高,因为ReentrantLock他是完全由java来实现的,该做的优化都已经做了,而synchronized是基于操作系统实现的,他存在更大的进步空间,因为操作系统的操作权限更大,能和硬件做的联动也更多。