大家好!又和大家见面了。为了避免面试尴尬,今天同比较通俗语言和大家聊下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次。

可中断的


Synchronized是不可中断的。

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

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

条件队列


Synchronized只有一个等待队列。

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

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

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

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

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

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

总结


今天我们用通俗易懂的文字描述了ReentrantLock和Synchronized关系。喜欢的请点赞加评论哦!点关注,不迷路,我是叫练【公众号】,边叫边练。期待我们下次再见!

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

  1. 【对线面试官】CountDownLatch和CyclicBarrier的区别

    <对线面试官>系列目前已经连载31篇啦,这是一个讲人话面试系列 [对线面试官]Java注解 [对线面试官]Java泛型 [对线面试官] Java NIO [对线面试官]Java反射 &am ...

  2. 当面试官问你GET和POST区别的时候,请这么回答.......

    文章内容转载于微信公众号WebTechGarden 一.GET和POST的'普通'区别 GET和POST是HTTP请求的两种基本方法,要说它们的区别,接触过WEB开发的人都能说出一二. 最直观的区别就 ...

  3. ReentrantLock和synchronized区别和联系?

    相同:ReentrantLock提供了synchronized类似的功能和内存语义,都是可重入锁. 不同: 1.ReentrantLock功能性方面更全面,比如时间锁等候,可中断锁等候,锁投票等,因此 ...

  4. 在面试官问你BS和CS区别的时候如何回答??

    这是我下来整理好的,如果哪里不全,望大家多多指教 C/S是Client/Server的缩写.服务器通常采用高性能的PC.工作站或小型机,并采用大型数据库系统,如Oracle.Sybase.Inform ...

  5. 面试官就是要问我SpringMVC的源码,差点顶不住!

    <对线面试官>系列目前已经连载22篇啦!有深度风趣的系列! [对线面试官]Java注解 [对线面试官]Java泛型 [对线面试官] Java NIO [对线面试官]Java反射 & ...

  6. 【对线面试官】Kafka基础入门

    <对线面试官>系列目前已经连载33篇啦,这是一个讲人话面试系列 [对线面试官]Java注解 [对线面试官]Java泛型 [对线面试官] Java NIO [对线面试官]Java反射 &am ...

  7. 【高并发】面试官:Java中提供了synchronized,为什么还要提供Lock呢?

    写在前面 在Java中提供了synchronized关键字来保证只有一个线程能够访问同步代码块.既然已经提供了synchronized关键字,那为何在Java的SDK包中,还会提供Lock接口呢?这是 ...

  8. 面试官:说一下Synchronized底层实现,锁升级的具体过程?

    面试官:说一下Synchronized底层实现,锁升级的具体过程? 这是我去年7,8月份面试的时候被问的一个面试题,说实话被问到这个问题还是很意外的,感觉这个东西没啥用啊,直到后面被问了一波new O ...

  9. ReentrantLock和synchronized的区别

    一.ReentrantLock类 ReentrantLock 类实现了 Lock ,它拥有与 synchronized 相同的并发性和内存语义,但是添加了类似锁投票.定时锁等候和可中断锁等候的一些特性 ...

随机推荐

  1. 太酷炫了!!我会Python 导包八种方法,你呢?

    1. 直接 import 人尽皆知的方法,直接导入即可 >>> import os >>> os.getcwd() '/home/wangbm'复制代码 与此类似的 ...

  2. .Net Core的简单单元测试基于Mock和自定义

    首先创建 使用mock 外部依赖一般用Mock 模拟 下载包 例如 3.1:首先先要使用MOCk来模拟测试方法需要的参数,这一步为 Arrange; 简单的模拟 var mock = new Mock ...

  3. C#中RDLC控制某列的显示隐藏

    使用 1.添加参数IsEnable(用于控制显示或隐藏)2.在RDLC页面,需要控制的列上,右键,列的可见性...,基于表达式隐藏或显示3.输入 IIF(Parameters!IsEnable.Val ...

  4. Hyperledger fabric 链码篇GO(四)

    Hyperledger fabric 链码篇GO(四) fabric中的链码也就是我们区块链所认知的智能合约,fabric中可由nodejs,java,go编写,本篇只针对GO语言编写链码.将详细介绍 ...

  5. 如何将离线计算业务的成本降低65%——弹性容器服务EKS「竞价实例」上线

    在容器化的应用场景中,大数据计算是其中很大并且业务应用在逐渐增加的一个热门领域,包括越来越多的人工智能企业,都在使用容器技术来支持业务中的大量计算任务.降低成本.提升资源利用率也是当前这部分用户非常期 ...

  6. C#脚本引擎CS-Script

    最近想要在程序中嵌入一个C#脚本引擎,在.NET Framework时代用过一个叫做CS-Script的东西,感觉还是不错,发现现在也支持.NET Core了,试着嵌入一下. 比较 要说能够运行C#脚 ...

  7. 【Azure App Service】C#下制作的网站,所有网页本地测试运行无误,发布至Azure之后,包含CHART(图表)的网页打开报错,错误消息为 Runtime Error: Server Error in '/' Application

    问题描述 C#下制作的网站,所有网页本地测试运行无误,发布至Azure之后,包含CHART(图表)的网页打开报错,错误消息为 Runtime Error: Server Error in '/' Ap ...

  8. easyui中设置开始日期只能选择比结束日期小的日期,js代码获取日期的值

    $("#start_date").datebox({ onSelect: function (beginDate) { $('#end_date').datebox().dateb ...

  9. Java虚拟机详解04----GC算法和种类

    [声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/4 ...

  10. Buffer的重要属性 position/limit/capacity

    1 package nio; 2 3 import java.nio.IntBuffer; 4 5 /** 6 * Buffer的重要属性 position/limit/capacity 7 * po ...