谈谈synchronized 和 ReentrantLock 的区别?

相同点

        synchronized和ReentrantLock都是Java中的可重入锁;


不同点

        回答思路:缺点 + 优点;

使用方法

        1.synchronized 可以用来修饰普通方法、静态方法和代码块;

        2.ReentrantLock 只能用于代码块,核心用法有三个方法:

lock()      //加锁
unlock()    //解锁 
tryLock()   //尝试加锁

        其中lock()和unlock()这两者之间如果有 return 或者有异常,就可能导致unlock执行不到;

所以若想防止中断可以这样去写(提供了更多可能,如下图)

ReentrantLock具有解决“死等的策略”,提供了更多可能

        从ReentrantLock的第三个方法中可以看出,tryLock()是试试看是否能加上锁,若成功了,就加锁成功,若失败了,就放弃,并且可以指定加锁的等待超时时间;

 获取和释放锁的方式不同

        从ReentrantLock的三个方法中可以看出,ReentrantLock是需要通过手动加锁和释放锁,而synchronized是自动加锁,已经执行完后释放锁;

锁类型不同

        ReentrantLock既可以是公平锁,也可以是非公平的(默认非公平),若想是他成为公平锁,传一个参数即可,如下图:

         synchronized是非公平锁;

唤醒机制不同

        synchronized是通过 wait() / notify() 搭配来实现唤醒机制的,并且是随即唤醒一个等待线程;

        ReentrantLock是搭配Condition类实现的,可以指定唤醒哪个等待的线程;

底层实现不同(不是那么重要,具体看面试情况)

        synchronized是java关键字,底层是JVM实现的(通过C++实现);

        ReentrantLock是标准库的一个类,底层是Java实现的;


        

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

陈亦康

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值