写点什么

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

用户头像
叫练
关注
发布于: 2021 年 01 月 26 日
面试官:你说说ReentrantLock和Synchronized区别

大家好!又和大家见面了。为了避免面试尴尬,今天同比较通俗语言和大家聊下 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,会将条件队列一个线程或多个线程加入到同步队列。

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


总结


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


tempimage1611629165941.gif


发布于: 2021 年 01 月 26 日阅读数: 31
用户头像

叫练

关注

我是叫练,边叫边练 2020.06.11 加入

Java高级工程师,熟悉多线程,JVM

评论

发布
暂无评论
面试官:你说说ReentrantLock和Synchronized区别