谈谈synchronized 和 ReentrantLock 的区别?

人生之路不会是一帆风顺的,我们会遇上顺境,也会遇上逆境,在所有成功路上折磨你的,背后都隐藏着激励你奋发向上的动机,人生没有如果,只有后果与结果,成熟,就是用微笑来面对一切小事。

导读:本篇文章讲解 谈谈synchronized 和 ReentrantLock 的区别?,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com,来源:原文

相同点

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


不同点

        回答思路:缺点 + 优点;

使用方法

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

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

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

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

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

谈谈synchronized 和 ReentrantLock 的区别?

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

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

 获取和释放锁的方式不同

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

锁类型不同

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

谈谈synchronized 和 ReentrantLock 的区别?

         synchronized是非公平锁;

唤醒机制不同

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

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

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

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

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


谈谈synchronized 和 ReentrantLock 的区别?

 

        

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/124320.html

(0)
飞熊的头像飞熊bm

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!