private Node enq(final Node node) { for (;;) { Node t = tail; if (t == null) { // Must initialize if (compareAndSetHead(new Node())) tail = head; } else { node.prev = t; if (compareAndSetTail(t, node)) { t.next = node; return t; } } } }
这是AQS中的一小部分,函数功能是在队列中插入一个节点,AQS队列,为了节省开销,都是在用懒初始化的模式,在往队列里面插入的时候,才去初始化头节点和尾节点。原文注释
CLH queues need a dummy header node to get started. But we don't create them on construction, because it would be wasted effort if there is never contention. Instead, the node is constructed and head and tail pointers are set upon first contention.
先假设只有一个线程,第一次进入到这段代码时,进入到第4行,然后正确的设置了head节点,相当于head,tail都指向一个新new出来的node节点,由于是死循环,程序会运行到第7行,运行compareAndSetTail(t, node)后,tail指向新的尾节点,就是函数传入的入参node,node的prev指针指向原来的tail,原来的tail的next指针指向node
private final boolean compareAndSetHead(Node update) { return unsafe.compareAndSwapObject(this, headOffset, null, update); }
以上代码原子的设置当前对象的head字段,思想上,类似数据库的乐观锁,set head = update where head=null, 多线程模式下,只有一个线程能够设置成功,类似的向队列尾巴,添加一个节点,也只有一个线程能够成功,如果没有成功,由于调用程序写的是死循环,会向新的尾巴上增加节点,直到成功为止
private final boolean compareAndSetTail(Node expect, Node update) { return unsafe.compareAndSwapObject(this, tailOffset, expect, update); }
总结,这段代码很巧妙的避免了多线程问题,将一个节点加入到队列中,并用了懒初始化,头节点和尾节点
相关推荐
AQS通过维护一个FIFO的等待队列来管理线程的同步状态,它提供了一种抽象的方式来实现独占和共享的资源控制,如ReentrantLock、Semaphore等都是基于AQS构建的。在本文中,我们将深入探讨AQS的工作原理及其在实际项目...
在 AQS 中,维护了一个 volatile 的整数 state,表示共享资源的状态另外还有一个 FIFO 的线程等待队列,用于存储多线程争用资源被阻塞时的线程。 AQS 提供了四种方法来控制资源的获取和释放:tryAcquire()、...
AQS全称为AbstractQueuedSynchronizer,是java中用于构建锁以及其他同步器的一个框架。在多线程的编程中,同步问题是一个非常重要的问题,而AQS正是为了解决这个问题而生的。 首先,我们需要了解的是AQS的核心思想...
### JDK_AQS解析 #### 概述 在Java并发编程中,`AbstractQueuedSynchronizer`(简称AQS)是实现锁和其他同步工具...通过学习AQS,我们不仅能更深入地了解Java并发库的内部实现,还能更好地利用这些工具解决实际问题。
java锁AQS基础逻辑
从JUC中的AQS引入,讲解Java volatile与AQS锁内存可见性
juc 的aqs介绍。
AQS流程图ReentranLock.vsdx
《Java并发编程:深入理解AQS》 在Java编程领域,多线程和并发处理是不可或缺的一部分,而Java.util.concurrent库则是实现并发...通过阅读"aqs.pdf"文档,可以深入学习AQS的内部实现细节以及如何在实际项目中应用。
AQS抽象队列同步器,AQS抽象队列同步器
java大师doug lean 在JDK1.5版本的AQS论文中文翻译。 许可:本作品的全部或部分在不为牟利或商业利益为目的的,且在第一页引述本声明及全完整引用的前提下,以数码或硬拷贝形式供个人或课堂使用的复制或分发不收取...
为了学习JUC,AQS是基础中的基础,所以我们首先深入了解下AQS。 一、锁的介绍 为了了解AQS的源码,我们需要先大概下锁中的一些功能 1.1 乐观锁/悲观锁 乐观锁与悲观锁是一种广义上的概念,体现了看待线程同步的不同...
AbstractQueuedSynchronizer (AQS) 是 Java 并发库中的一个核心组件,它是实现高效并发控制的基础。AQS 提供了一种基于队列的线程同步机制,允许开发者构建自定义的锁和同步器。在Java并发编程中,如ReentrantLock、...
AQS作为Java并发工具包(JUC)中的一个核心抽象类,其设计目的是为了实现各种同步器(如锁、信号量等)。AQS主要通过三个核心组成部分来实现这些同步组件的功能: 1. **State变量及其CAS操作**:AQS维护了一个名为`...
AQS 是 AbstractQueuedSynchronizer 的简称,AQS 是一个抽象的队列式同步器框架,提供了阻塞锁和 FIFO 队列实现同步操作。JUC 包中的同步类基本都是基于 AQS 同步器来实现的,如 ReentrantLock,Semaphore 等。 二、...
在Java并发编程领域,AbstractQueuedSynchronizer(简称AQS)是一个核心组件,它是Java并发库中的基石,被许多并发工具类如ReentrantLock、Semaphore、CountDownLatch等作为基础框架来实现。AQS通过维护一个FIFO等待...