大家好!又和大家见面了。为了避免面试尴尬,今天同比较通俗语言和大家聊下ReentrantLock和Synchronized区别!另外:整理了一份Java面试宝典完整版PDF,已成文档

使用方式

Synchronized可以修饰实例方法,静态方法,代码块。自动释放锁。

ReentrantLock一般需要try catch finally语句,在try中获取锁,在finally释放锁。需要手动释放锁。

实现方式

Synchronized是重量级锁。重量级锁需要将线程从内核态和用户态来回切换。如:A线程切换到B线程,A线程需要保存当前现场,B线程切换也需要保存现场。这样做的缺点是耗费系统资源

ReentrantLock是轻量级锁。采用cas+volatile管理线程,不需要线程切换切换,获取锁线程觉得自己肯定能成功,这是一种乐观的思想(可能失败)。

用一个形象例子来说明:比如您在看我这篇文章时,觉得“重量级锁”概念不是很明白,就立刻去翻看关于“重量级锁”的其他文章,过会儿回头再继续往下面看, 这种行为我们称为切换。保存现场的意思就是你大脑需要记住你跳跃的点然后继续阅读,如果文章篇幅大,你的大脑可能需要记忆越多的东西,会越耗费脑神经。同理,在轻量级锁中,你觉得“重量级锁”概念不是很明白,他不会立刻去翻看其他文章,他会坚持会儿继续看,如果实在不明白再去翻资料了。需要注意的是:这是两种不一样的思维方式,前者是被动阻塞悲观锁,状态是block,后者是主动的阻塞乐观锁,状态是wait。

公平和非公平

Synchronized只有非公平锁。

ReentrantLock提供公平和非公平两种锁,默认是非公平的。公平锁通过构造函数传递true表示。

用一个形象例子来说明:排队打饭,Synchronized允许插队,如果ReentrantLock是公平锁,就不许插队了。

可重入锁

Synchronized和ReentrantLock都是可重入的,Synchronized是本地方法是C++实现,而ReentrantLock是JUC包用Java实现。

用一个形象例子来说明:如下图:一个房中房,房里外各有一把锁,但只有唯一的钥匙可以开,拥有钥匙的人可以先进入门1,再进入门2,其中进入门2就是叫锁可重入了。

在ReentrantLock中,重入次数用整形state表示。进入1次递增1次,出来1次递减1次。

image.png

可中断的

Synchronized是不可中断的。

ReentrantLock提供可中断和不可中断两种方式。其中lockInterruptibly方法表示可中断,lock方法表示不可中断。

用一个形象例子来说明:叫练和叫练女朋友一起去做核酸,叫练女朋友排在前面,所以叫练女朋友进门先做,叫练在门外排队等待过程中突然接到领导电话要回去修改bug,叫练现在有两种选择,1.不和女朋友打招呼,立即回去修改bug,2.等待女朋友做完核酸,进去和女朋友打个招呼,然后回去修改bug。这两种情况最终都会导致一个结果,叫练无法完成核酸,在这两种情况中,虽然叫练都被领导中断了,但第一种情况叫练立即反馈领导叫可中断,第二种情况是叫练为了不做单身狗,打个招呼再去修改bug,需要注意的是“打招呼”需要提前获取锁,也就是需要等待叫练女朋友做完核酸检测。如果是你,遇到叫练这种情况,你会怎么办?期待你的答复!

条件队列

Synchronized只有一个等待队列。

ReentrantLock中一把锁可以对应多个条件队列。通过newCondition表示。

用一个形象例子来说明:母鸡下蛋和捡蛋人对应生产者和消费者,母鸡产蛋后,捡蛋人需要被母鸡通知,母鸡产蛋过程中,其中捡蛋人就会入条件队列(等待队列)。捡蛋人捡蛋完成后,捡蛋人需要通知母鸡继续产蛋,捡蛋人捡蛋过程中,母鸡也需要加入条件队列等待。

注意:有几个概念需要说明下。同步队列,条件队列和等待队列。

同步队列:多线程同时竞争一把锁失败被挂起的线程。

条件队列:正在执行的线程调用await/wait,从同步队列加入的线程会进入条件队列。正在执行线程调用signal/signalAll/notify/notifyAll,会将条件队列一个线程或多个线程加入到同步队列。

等待队列:和条件队列一个概念。

作者:叫练
原文链接:https://www.cnblogs.com/jiaolian/p/14329299.html


http://www.taodudu.cc/news/show-5951630.html

相关文章:

  • 哈?!你有对象还被人叫单身狗?
  • 【SSM】写给单身狗看的Spring总结
  • 21python_面向对象封装案例
  • php和prp的区别,干细胞和PRP的区别,90%求美者都会理解错!
  • Java入门-类
  • 17python_函数进阶
  • 19python_类和对象
  • 14_python高级变量类型
  • 你必须要学会的动态代理
  • 有了它,产品经理小美再也不掉头发和掐架了....
  • 回忆小美
  • fiddler抓取手机端微信
  • vivo刷机教程
  • vivo检查更新服务器无响应,vivo系统升级教程
  • Python 3.8 发布,新特性全面解读!
  • 双十一投影仪怎么买?极米、当贝、坚果、米家投影2000~3000元有什么推荐?
  • 华为鸿蒙os游戏,华为鸿蒙系统怎么更新?HarmonyOS2更新教程与功能介绍[多图]
  • 618高端投影仪哪几款值得买?当贝投影F3行能有多高?
  • DLP智能投影仪--Toumei V5
  • 《脱颖而出——成功网店经营之道》一2.4 可持续化发展
  • 云技术,智能家居与嵌入式——前景好的产业
  • 助力“黑科技” 阿里云发布人工智能服务DTPAI
  • [tcache double free + orw]MynoteMax
  • 初学Python(六)
  • 【八芒星计划】 _IO_2_1_stdout_和_IO_2_1_stdin_ 的任意地址读和任意地址写
  • 【八芒星计划】 劫持_IO_2_1_stdout_泄露libc
  • 【八芒星计划】 ret2__libc_csu_init
  • 【八芒星计划】静态编译劫持fini_array
  • 【八芒星计划】 House of Orange
  • 【八芒星计划】绕过canary

面试官:你说说ReentrantLock和Synchronized区别!相关推荐

  1. 面试官:你说说ReentrantLock和Synchronized区别

    目录 使用方式 实现方式 公平和非公平 可重入锁 可中断的 条件队列 总结 大家好!又和大家见面了.为了避免面试尴尬,今天同比较通俗语言和大家聊下ReentrantLock和Synchronized区 ...

  2. 面试官最想要的synchronized,你值得拥有

    synchronized简介 synchronized 是Java语言的一个关键字,它本身的意思为同步,是用来保证线程安全的,可用来给对象和方法或者代码块加锁,当它锁定一个方法或者一个代码块的时候,同 ...

  3. 面试官:说说 typeof 与 instanceof 区别?

    一.typeof typeof 操作符返回一个字符串,表示未经计算的操作数的类型 使用方法如下: typeof operand typeof(operand) operand表示对象或原始值的表达式, ...

  4. 【运维面试】面试官:reids和memcache的区别?

    前言 redis和memcache的区别在面试中也经常会被提到,今天我们来看看redis与memcache的知识 概念 memcached: 一款开源的,高性能,分布式的内存系统 redis:一个开源 ...

  5. 面试官:谈谈equals() 和 == 的区别

    引言 谈谈equals() 和 == 的区别,这是一个非常经典的问题,不是特别难,面试也时有问道:但是很多小伙伴在面试时脑子却一片空白,痛失offer:所以在这里我详细介绍一下这两者的区别,希望对你能 ...

  6. 面试官:Java深拷贝和浅拷贝区别

    文章目录 一.拷贝的引入 (1).引用拷贝 (2).对象拷贝 二.浅拷贝 (1).定义 (2).浅拷贝实例 三.深拷贝 (1).定义 (2).深拷贝实例 一.拷贝的引入 (1).引用拷贝 创建一个指向 ...

  7. 一个synchronized跟面试官扯了半个小时

    前言 话说上回HashMap跟面试官扯了半个小时之后,二面迎来了没有削弱前的钟馗,法师的钩子让安琪拉有点绝望.钟馗穿着有些微微泛黄的格子道袍,站在安琪拉对面,开始发难,其中让安琪拉印象非常深刻的是法师 ...

  8. ssm中怎么使tomcat一起动就执行一个controller_【200期】面试官:你能简单说说 SpringMVC 的执行原理吗?...

    点击上方"Java面试题精选",关注公众号 面试刷图,查缺补漏 >>号外:往期面试题,10篇为一个单位归置到本公众号菜单栏->面试题,有需要的欢迎翻阅 阶段汇总集 ...

  9. arduino char*转string_【201期】面试官:String长度有限制吗?是多少?还好我看过...

    点击上方"Java面试题精选",关注公众号 面试刷图,查缺补漏 >>号外:往期面试题,10篇为一个单位归置到本公众号菜单栏->面试题,有需要的欢迎翻阅 阶段汇总集 ...

最新文章

  1. 修改Kali Linux终端主题
  2. 【docker】docker run命令详解
  3. php通过$_SERVER['HTTP_USER_AGENT']获取浏览器useAgent
  4. Echarts多个坐标轴多组/一组数据 - 温度降水量示例
  5. spark on yarn
  6. MapXtreme 安装、编码及打包注意事项
  7. Windows Server 2003域和活动目录
  8. [C/C++]关于C++11中的std::move和std::forward
  9. Taro+react开发(46)taro中环境判断
  10. Redis进阶实践之十六 Redis大批量增加数据
  11. OOP的几个不常用的方法
  12. JAVA简介及环境配置(复习)
  13. 虚拟服务器软件哪个好,虚拟机软件哪个好?热门虚拟机软件推荐
  14. 支付系统总结 ( 收单,收银,资产交互,账务 )
  15. unity开发 斗地主算法—判断手里的牌是否有大于上家的牌(是否显示要不起按钮)
  16. 如何浏览与下载全球免费的地图高分辨率(亚米级)的遥感影像?
  17. 组合模型预测模型_改进著名的nfl预测模型
  18. 计算机硬盘空间不足怎么删,Win10硬盘空间不足?教你这样清理,瞬间多出10个G!...
  19. 深入理解Linux内核使用浮点运算问题
  20. K8S环境部署jaeger-all-in-one

热门文章

  1. 使用fixed进行表格列冻结之后出现的问题
  2. java调用ORACLE 存储过程返回值22
  3. 分析超有用的办公免费素材网站
  4. 今天是我和老婆结婚一周年纪念日。
  5. 梦幻模拟战手游服务器维护,服务器数据互通公告
  6. css奇怪布局(一)
  7. python php 全双工,Python网络编程之使用select实现socket全双工异步通信功能
  8. DIOR HOMME_百度百科
  9. java基础之访问控制_繁星漫天_新浪博客
  10. 牛逼了!JDK 16 ZGC 实现最大暂停时间不超过1ms