ReentrantLock (独占锁、互斥锁)

ReentrantLock (独占锁、互斥锁),第1张

我们知道锁的基本原理是,基于将多线程并行任务通过某一种机制实现线程的串 行执行,从而达到线程安全性的目的。而Lock是juc中实现的锁接口,他定义了锁的一些行为规范,他的设计目的是为了解决 synchronized 关键字在一些并发场景下不适用的问题。

juc 包下的接口,定义了锁的规范。有多种实现类。

ReentrantLock 重入锁 一个持有锁的线程,在释放锁之前。此线程如果再次访问了该同步锁的其他的方法,这个线程不需要再次竞争锁,只需要记录重入次数。 重入锁的设计目的是为了解决死锁的问题

inr() 方法获取锁成功并没有释放锁的情况下调用dec()再次获取锁,假如没有重入锁的话这里会导致死锁。此线程如果再次访问了该同步锁的其他的方法,这个线程不需要再次竞争锁,只需要记录重入次数。

<span style='color:red'>内部是如何实现的?假如线程中断锁没有及时释放怎么办呢</span>

NonfairSync 重入锁的核心实现

AQS中维护了一个存储了等待线程的Node节点的双端链表,有首节点head与尾节点tail,创建一个Node节点里面存储的是当前线程,如果已经有了tail节点则尝试cas *** 作添加当前节点到链表的尾结点,如果没有则进行初始化 *** 作cas *** 作创建一个head节点并且自旋(没有任何结束条件的循环)cas *** 作添加尾结点到链表的尾部,最终返回新增的Node节点。

对于插入到等待队列中的Node节点通过 addWaiter 方法把线程添加到链表后,会接着把 Node 作为参数传递给 acquireQueued 方法,去再次竞争锁

挂起当前线程。这里调用了LockSupportpark(this)把线程挂起了并返回 Threadinterrupted() 线程复位。

释放锁的业务逻辑不需要考虑多线程的问题,他还是被一个线程持有。因为重入锁的机制state>=1 释放就是 getState() - releases并跟新state为最新值,如果state=0则返回。

以上就是关于ReentrantLock (独占锁、互斥锁)全部的内容,包括:ReentrantLock (独占锁、互斥锁)、、等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/web/9822076.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-02
下一篇2023-05-02

发表评论

登录后才能评论

评论列表(0条)

    保存