Java中的Sychronized和ReentrantLock的区别?

上面这个问题是一个在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底层有一个锁升级的过程,优化了效率低的问题。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值