关于lock:面试官你说说ReentrantLock和Synchronized区别

9次阅读

共计 1825 个字符,预计需要花费 5 分钟才能阅读完成。

大家好!又和大家见面了。为了防止 面试 难堪,明天同比拟艰深语言和大家聊下 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 关系。喜爱的请点赞加评论哦!点关注,不迷路,我是叫练【公众号】,边叫边练。期待咱们下次再见!

正文完
 0