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

2023-10-28

大家好!又和大家见面了。为了避免面试尴尬,今天同比较通俗语言和大家聊下ReentrantLock和Synchronized区别!

使用方式
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,会将条件队列一个线程或多个线程加入到同步队列。

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

面试官:你说说ReentrantLock和Synchronized区别 的相关文章

  • 华为8.21日成渝地区笔试题,,,超详细的喔

    8月22日面试的 面试感受放到牛客网上了 点下面链接即可 https www nowcoder com discuss 235118 笔试一共三道题 分别是100分 200分 300分 可以使用本地IDE 第一题 报文转义AC20 如果报文
  • c# 三维向量常用运算函数

    三维向量运算 求点到直线垂足交点 点到直线距离 计算向量夹角 计算AB与CD两条直线的交点 计算AB与CD两条线段的交点 判断点是否在四边形内 abcd为正方形时不准确 判断点p 是否在四边形abcd内 求点到直线垂足交点

随机推荐

  • rocketmq参数配置

    下载代码 git clone https github com tgou RocketMQ 1 打包 mvn Dmaven test skip trueclean package install assembly assembly U 2
  • [转]Mapx在C#中的应用

    在这段代码中 我们应用MapX控件结合老美地图做了最基本的 地图浏览功能 放大 缩小 拖动 全图 测量距离 测量面积 杨雨田 YangYutian Hotmail Com using System using System Drawing
  • 如何使用git命令添加文件和提交文件

    转载 https www cnblogs com olive27 p 6047646 html 1 进入指定文件夹内 启动 git bash here 2 初始化文件夹 git init 3 开始添加文件 所有文件添加方法 git add
  • 带有v-model的input 保证内容是非负整数,键盘输入适用

    带有v model的input 保证内容是非负整数 键盘输入适用 输入小数时自动四舍五入成整数 输入负数时自动变0 遇到的坑 不太会vue 一直按照普通input搞得 给input的value赋值 以为就完了 结果输入小数后 确实立刻变成了
  • Scala中的 方法map和flatMap

    map操作 map操作是针对集合的典型变换操作 它将某个函数应用到集合中的每个元素 并产生一个结果集合 比如 给定一个字符串列表 我们可以通过map操作对列表的中每个字符串进行变换 让每个字符串都变成大写字母 这样变换后就可以得到一个新的集
  • 高德地图的简单使用

    提示 文章写完后 目录可以自动生成 如何生成可参考右边的帮助文档 文章目录 一 如何在Vue中引入基础高德地图 1 注册并登录高德地图开放平台 2 安装高德地图加载器 二 封装一个自定义地图组件 并初始化 三 添加放大缩小地图 转盘 四 点
  • 学习君github

    一 冰蝎 https github com rebeyond Behinder 源代码审计漏洞 白盒测试的各种漏洞风险描述或具体修复方案 https github com wooyunwang Fortify Golang 100天从新手到
  • Web安全总结

    目录 网站架构 一般web服务器结构 相比于传统的网络攻击 基于web的攻击有什么不同 HTTP协议 HTTP响应拆分攻击 HTTPS 针对HTTPS协议的攻击 那么如何保证证书的唯一性 HTTP会话 Cookie和Session的关系 H
  • DCIC共享单车数据可视化教程!

    今天选取的地图是前几天利用数字中国创新大赛提供的共享单车数据做的一个可视化效果 很多人询问制作方法 今天给大家介绍下 自古有云 巧妇难为无米之炊 要做这种数据可视化 数据是关键 数据去哪里找呢 可以在DCIC官网下载 data xm gov
  • 如何统计字符出现频率

    可以使用 reduce 方法来统计字符出现的频率 下面是一个示例代码 const str Hello world const frequency str split reduce acc char gt if acc char acc ch
  • YAML文件(.yml)中的键(key)通过变量引用来设置

    转自 https www cnblogs com haycheng p 13299183 html 通过变量引用设置配置量的 值 value 在YAML文件中 一个配置量的值可以通过引用另一个变量来设置 例如 default db port
  • 在简历上写了“精通”后,我差点被面试官问到窒息....

    前言 如果有真才实学 写个精通可以让面试官眼前一亮 如果是瞎写 基本就要被狠狠地虐一把里 最近在面试 我现在十分后悔在简历上写了 精通 二字 先给大家看看我简历上的技能列表 熟悉软件测试理论基础 熟悉软件测试的流程 方法 具备测试用例需求分
  • 基于element-ui中table表格组件进行二次封装

    基于element ui中table表格组件进行二次封装 在平时开发的时候很多情况都会使用到表格和分页功能 所以根据用到的表格功能做一个基础的封装并记录下来 如果有其他功能需要添加直接在此基础上进行扩展即可 基础功能 1 表格内容的正常显示
  • Mysql查询和索引

    mysql查询 1 逻辑架构图 2 mysql查询执行路径 1 客户端发送一条查询给服务器 2 服务器先检查查询缓存 如果命中了 则立刻返回存储在缓存中的结果 3 服务端进行sql解析 预处理 再由优化器生成对应的执行计划 4 mysql根
  • 基于ZigBee的智能家居系统设计

    1 前言 智能家居 smart home home automation 是以住宅为平台 利用综合布线技术 网络通信技术 安全防范技术 自动控制技术 音视频技术将家居生活有关的设施集成 构建高效的住宅设施与家庭日程事务的管理系统 提升家居安
  • python柱状图加百分比_【python】封装接口直接利用DataFrame绘制百分比柱状图

    手动反爬虫 原博地址 知识梳理不易 请尊重劳动成果 文章仅发布在CSDN网站上 在其他网站看到该博文均属于未经作者授权的恶意爬取信息 1 背景前言 最近打比赛遇到的问题有点多 在绘制了堆叠柱状图之后 队长说不仅要看到具体的数量多少的堆叠图
  • 数字后端概念——padding

    文章目录 Adding Instance Padding Adding Module Padding Adding Cell Padding 总结 查看Innovus UG gt Design Implementation Capabili
  • JavaWeb学习笔记8 Servlet2 ServletConfig类

    ServletConfig类 ServletConfig类 ServletConfig类的三大作用 ServletConfig类 ServletConfig类是Servlet程序的配置信息类 Servlet程序和ServletConfig对
  • 【Python 1-2】Visual Studio Code(VSCode) 配置 Python开发环境

    使用 VSCode 作为开发Python的IDE工具 文章首发地址 IDE Integrated Development Environment 集成开发环境 目前支持Python的IDE有很多 有PyCharm Eclipse Atom
  • 面试官:你说说ReentrantLock和Synchronized区别

    大家好 又和大家见面了 为了避免面试尴尬 今天同比较通俗语言和大家聊下ReentrantLock和Synchronized区别 使用方式 Synchronized可以修饰实例方法 静态方法 代码块 自动释放锁 ReentrantLock一般