当前位置: 首页 > wzjs >正文

网站服务器和空间seo是什么专业

网站服务器和空间,seo是什么专业,怎么在网站添加关键词,建筑公司会计账务处理1. 引言 Java 并发包 (java.util.concurrent.locks) 中的 ReentrantLock、Semaphore、CountDownLatch 等同步工具的核心实现都依赖于 AQS (AbstractQueuedSynchronizer)。AQS 提供了一套通用的同步框架,通过 FIFO 队列 管理线程的排队与唤醒,并支持 独占…

1. 引言

Java 并发包 (java.util.concurrent.locks) 中的 ReentrantLockSemaphoreCountDownLatch 等同步工具的核心实现都依赖于 AQS (AbstractQueuedSynchronizer)。AQS 提供了一套通用的同步框架,通过 FIFO 队列 管理线程的排队与唤醒,并支持 独占锁共享锁 两种模式。

本文将深入分析 AQS 的实现原理,包括:

  • AQS 的核心数据结构
  • 同步队列(CLH 变体)的实现
  • 线程的入队、阻塞、唤醒机制
  • 公平锁与非公平锁的实现差异
  • AQS 的模板方法设计
  • 关键源码分析 + 流程图

2. AQS 的核心结构

AQS 的核心依赖以下几个关键组件:

  1. volatile int state:同步状态,不同的锁有不同的语义:
    • ReentrantLockstate 表示锁的重入次数(0 表示未锁定,1 表示被占用,>1 表示重入)。
    • Semaphorestate 表示剩余的许可数量。
    • CountDownLatchstate 表示剩余的计数。
  2. 双向同步队列(CLH 变体):存储等待获取锁的线程。
  3. Node 节点:封装线程和等待状态。

2.1 AQS 同步队列结构

AQS 使用 双向链表 实现同步队列,每个节点是一个 Node 对象:

static final class Node {volatile int waitStatus;  // 节点状态(CANCELLED, SIGNAL, CONDITION, PROPAGATE)volatile Node prev;       // 前驱节点volatile Node next;       // 后继节点volatile Thread thread;   // 关联的线程Node nextWaiter;          // 用于条件队列或共享模式
}

waitStatus 的取值:

  • CANCELLED (1):线程已取消等待(超时或中断)。
  • SIGNAL (-1):当前节点的后继节点需要被唤醒。
  • CONDITION (-2):节点在条件队列中(如 Condition.await())。
  • PROPAGATE (-3):共享模式下,唤醒需要传播。

headtail

  • head:虚拟头节点,不存储线程,仅用于管理队列。
  • tail:指向队列的最后一个节点。

同步队列示例:

head (dummy) → Node(thread1, SIGNAL) → Node(thread2, SIGNAL) → tail

3. AQS 的关键流程

3.1 获取锁(acquire)

ReentrantLock 为例,调用 lock() 最终会进入 AQS 的 acquire(1)

public final void acquire(int arg) {if (!tryAcquire(arg) &&      // 尝试获取锁(子类实现)acquireQueued(addWaiter(Node.EXCLUSIVE), arg)) // 失败则入队selfInterrupt();          // 如果被中断,恢复中断状态
}

流程详解:

  1. tryAcquire(arg)(子类实现):
    • 非公平锁:直接尝试 CAS 修改 state,成功则获取锁。
    • 公平锁:先检查是否有前驱节点 (hasQueuedPredecessors()),再尝试 CAS。
  2. addWaiter(Node.EXCLUSIVE)
    • 将当前线程包装成 Node,CAS 插入队尾。
  3. acquireQueued(node, arg)
    • 自旋检查前驱是否是 head(即自己是第一个等待者)。
    • 如果是,再次尝试 tryAcquire
    • 如果不是,调用 shouldParkAfterFailedAcquire() 判断是否需要阻塞:
      • 前驱 waitStatus=SIGNAL → 可以安全阻塞(前驱释放时会唤醒自己)。
      • 前驱 waitStatus=CANCELLED → 跳过取消的节点。
    • 调用 LockSupport.park() 阻塞线程。

流程图:

graph TDA[线程调用 lock()] --> B{tryAcquire 成功?}B -->|是| C[获取锁, 直接执行]B -->|否| D[addWaiter 入队]D --> E[acquireQueued 自旋检查]E --> F{前驱是 head?}F -->|是| G[tryAcquire 尝试获取锁]G -->|成功| H[设置自己为 head, 执行]G -->|失败| I[shouldParkAfterFailedAcquire]F -->|否| II --> J[LockSupport.park 阻塞]

3.2 释放锁(release)

调用 unlock() 最终进入 release(1)

public final boolean release(int arg) {if (tryRelease(arg)) {       // 子类实现释放逻辑Node h = head;if (h != null && h.waitStatus != 0)unparkSuccessor(h);   // 唤醒后继节点return true;}return false;
}

流程详解:

  1. tryRelease(arg)(子类实现):
    • 修改 state,如果 state=0,表示完全释放。
  2. unparkSuccessor(h)
    • 找到 head 后第一个未被取消的节点。
    • 调用 LockSupport.unpark(node.thread) 唤醒线程。

唤醒后的行为:

  • 被唤醒的线程回到 acquireQueued 的循环,再次尝试 tryAcquire
  • 如果成功,它将成为新的 head,并继续执行。

4. 公平锁 vs 非公平锁

4.1 非公平锁(默认)

特点:

  • 新线程可以“插队”,直接尝试 CAS 获取锁,无需排队。
  • 吞吐量更高,但可能导致“饥饿”。

实现 (NonfairSync):

final void lock() {if (compareAndSetState(0, 1))  // 先尝试插队setExclusiveOwnerThread(Thread.currentThread());elseacquire(1);  // 失败再走正常流程
}protected final boolean tryAcquire(int acquires) {return nonfairTryAcquire(acquires);  // 不检查队列,直接 CAS
}

4.2 公平锁

特点:

  • 严格按照 FIFO 顺序获取锁,新线程必须排队。
  • 避免“饥饿”,但性能较低。

实现 (FairSync):

protected final boolean tryAcquire(int acquires) {if (!hasQueuedPredecessors() &&  // 检查是否有前驱节点compareAndSetState(0, acquires)) {setExclusiveOwnerThread(current);return true;}return false;
}

对比总结:

特性非公平锁公平锁
获取策略允许插队严格 FIFO
性能更高(减少线程切换)较低(严格排队)
适用场景高并发、锁竞争激烈需要严格顺序的场景

5. 总结

  • AQS 的核心state + CLH 变体队列 + LockSupport 阻塞/唤醒。
  • 同步队列管理:通过 Node 节点、head/tail 指针实现线程排队。
  • 公平性控制:由 tryAcquire 是否检查队列决定。
  • 适用场景
    • 非公平锁:大多数高并发场景(如 ReentrantLock 默认)。
    • 公平锁:需要严格顺序的场景(如任务调度)。

AQS 是 Java 并发包的基石,理解它的实现有助于深入掌握 ReentrantLockSemaphoreCountDownLatch 等同步工具的工作原理。

http://www.dtcms.com/wzjs/98418.html

相关文章:

  • 慈利县建设局网站友情链接检测
  • 郑州网站建设三牛公关公司是干嘛的
  • 网站的栏目是什么下载百度app
  • 网站怎么做分类聚合百度快照怎么优化排名
  • 湘潭网站建设方案费用百度竞价最低点击一次多少钱
  • 无为县城乡建设局网站首页公众号开发
  • 清溪做网站的电话网络营销的手段包括
  • 建设银行长清网站网络推广员要怎么做
  • 广西城乡住房建设部网站网上推销产品的软件
  • 昆明做网站vr外贸建站服务推广公司
  • 黄岐网站制作百度站长平台官网
  • wordpress好看的背景图片seo短视频
  • 泉州外贸网站建设都有哪些公司衡水今日头条新闻
  • 网站开发 定制 合同百度云搜索引擎 百度网盘
  • 卡通风格的宣传网站网站开发培训
  • 政府类网站建设网络推广需要多少钱
  • 上海市建设工程材料网站怎样进入12345的公众号
  • 怎么找到做网站的客户域名注册平台有哪些
  • 优秀网站设计 打造有吸引力的网站网页友情链接
  • jsp做网站白云百度seo公司
  • 涿州网站建设天峰怎么做互联网营销推广
  • 小说阅读网站怎么建设关键词语有哪些
  • 做软件赚钱还是做网站赚钱百度收录提交网址
  • 网站建设主要问题软文推广案例500字
  • 网站录屏可以做证据吗查询网址域名ip地址
  • wordpress 头条主题百度seo优化教程
  • 房地产开发公司简介优化大师有必要花钱吗
  • 群晖dsm上的网站建设网络营销专家
  • 网站建设哪里找好用的视频播放器app
  • dede复制网站模板企业培训考试平台官网