
锁
文章平均质量分 84
剑语诗情
这个作者很懒,什么都没留下…
展开
-
JUC——AQS部分疑问及解答
当然了,上面也只是理想情况下的操作,如果出现了极端情况,也是会从尾节点遍历进行节点检查(例如:某节点next为null或者为已取消节点,那么此时无法唤醒next指向的节点,只能通过tail尾节点来向上遍历,找到最近的一个正常节点。(引申:队列是可能出现暂时性分叉的,假设在并发的极端情况下,多个线程都执行了上述步骤1,此时多个节点指向prev,但只有一个节点能成功执行步骤2,其他线程会继续循环,直至入队成功。从问题1可知,节点是会先更新节点的prev指针,然后再CAS更新尾节点。英文好的也可以去看看。原创 2023-02-21 17:19:07 · 205 阅读 · 0 评论 -
JUC——Lock详解
Lock是一种用于控制多个线程对共享资源访问的工具。通常情况下,锁提供对共享资源的独占访问(独占锁,即一次只有一个线程能获取锁),并且对共享资源的所有访问都必须先获取到锁。但是,有些锁也可能允许对共享资源的并发访问(共享锁,例如ReadWriteLock中的读锁)。原创 2023-02-20 16:05:51 · 407 阅读 · 0 评论 -
JUC——AQS源码解析
该篇主要以分析AQS的源码为主,从源码来看AQS是如何实现在独占模式和共享模式下的加锁、释放锁的逻辑。原创 2023-02-17 12:10:38 · 394 阅读 · 0 评论 -
AQS共享模式setHeadAndPropagate方法及doReleaseShared方法详解
PROPAGETE状态是为了防止极端情况下,释放锁的线程无法唤醒后继节点,让获取锁的线程能把唤醒操作继续下去获取锁的线程和释放锁的线程,同一时刻只有一个线程能去唤醒头节点的后继节点,其他线程会跳出循环不做操作,当然如果线程还未跳出循环时,头节点就发生了变化,那么这些线程会再次争夺执行唤醒操作的机会一个头节点的后继节点只会被唤醒一次。原创 2023-02-15 18:52:06 · 758 阅读 · 1 评论 -
JUC——AQS实现原理
AQS的全称为AbstractQueuedSynchronizer,也就是抽象队列同步器,位于java.util.concurrent.locks包下它是一个抽象类,本身已经提供了许多的基础功能,我们可以通过继承它来很方便的实现自定义的同步器个人理解,简单来讲,AQS本质就是个用来实现资源同步器的基础组件。在资源空闲时,允许线程去获取它,且在成功后将资源设置为被占用的状态;在资源被占用时,提供一定的阻塞等待唤醒机制来保证资源的后续分配。原创 2023-02-01 17:45:12 · 352 阅读 · 0 评论 -
AQS实现原理——Node节点
在介绍AQS之前,我们需要先来了解下Node节点类。AQS中的核心同步队列(CLH队列的变体)以及条件队列都是依靠Node节点来实现的。在线程没有竞争到锁资源时,会将线程信息包装成一个Node节点数据,该节点不仅记录了线程信息,还记录了线程的等待状态以及上下节点。原创 2023-01-10 18:24:38 · 561 阅读 · 0 评论