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

公司做网站需要服务器吗/线上宣传渠道和宣传方式

公司做网站需要服务器吗,线上宣传渠道和宣传方式,厦门做网站找哪家公司,网站建设有什么意见引言 上篇文章讲解了CountDownLatch源码,底层是继承了AQS基类调用父类和重写父类方法实现的,本文将简介AQS源码和架构设计,帮助我们更深入理解多线程实战。 源码架构 1. 状态变量 state AQS 使用一个 int 类型的变量 state 来表示同步状态…

引言

上篇文章讲解了CountDownLatch源码,底层是继承了AQS基类调用父类和重写父类方法实现的,本文将简介AQS源码和架构设计,帮助我们更深入理解多线程实战。

源码架构

1.  状态变量 state
AQS 使用一个 int 类型的变量 state 来表示同步状态。这个变量是 volatile 修饰的,保证了多线程之间的可见性。不同的同步器对 state 有不同的定义和使用方式,例如在 ReentrantLock 中,state 表示锁的重入次数;在 CountDownLatch 中,state 表示计数器的值。

private volatile int state;

2. 双向队列
AQS 内部维护了一个双向链表队列,用于存储等待获取锁的线程。这个队列是 CLH(Craig, Landin, and Hagersten)锁队列的变种。每个节点(Node)代表一个等待线程,包含线程引用、等待状态等信息。

static final class Node {// 共享模式static final Node SHARED = new Node();// 独占模式static final Node EXCLUSIVE = null;// 线程已取消static final int CANCELLED =  1;// 后继节点需要被唤醒static final int SIGNAL    = -1;// 线程在等待条件static final int CONDITION = -2;// 表示下一次共享式同步状态获取将会无条件地传播下去static final int PROPAGATE = -3;// 等待状态volatile int waitStatus;// 前驱节点volatile Node prev;// 后继节点volatile Node next;// 节点所包装的线程volatile Thread thread;// 指向下一个处于 CONDITION 状态的节点Node nextWaiter;...
}

而双向队列细分为条件队列和同步队列

同步队列

同步队列是 AQS 的核心队列,用于存放等待获取锁的线程节点。当线程尝试获取锁失败时,会被封装成节点加入到这个队列中等待。

在 AQS 类中有两个关键属性用于表示同步队列的头节点和尾节点:

private transient volatile Node head;
private transient volatile Node tail;

head 指向队列的头节点,tail 指向队列的尾节点,这两个属性都是 volatile 修饰的,保证了多线程环境下的可见性。

节点加入同步队列(addWaiter 方法)

private Node addWaiter(Node mode) {Node node = new Node(Thread.currentThread(), mode);// 尝试快速将节点插入到队列尾部Node pred = tail;if (pred != null) {node.prev = pred;if (compareAndSetTail(pred, node)) {pred.next = node;return node;}}// 快速插入失败,使用 enq 方法插入enq(node);return node;
}private Node enq(final Node node) {for (;;) {Node t = tail;if (t == null) { // 队列还未初始化if (compareAndSetHead(new Node()))tail = head;} else {node.prev = t;if (compareAndSetTail(t, node)) {t.next = node;return t;}}}
}

条件队列

条件队列用于实现线程的等待 - 通知机制,一个 AQS 可以有多个条件队列,每个 Condition 对象对应一个条件队列。

关键类 ConditionObject

ConditionObject 是 AQS 中实现条件队列的内部类,它包含一个指向条件队列头节点和尾节点的引用

public class ConditionObject implements Condition, java.io.Serializable {private transient Node firstWaiter;private transient Node lastWaiter;...
}

线程进入条件队列(await 方法)

public final void await() throws InterruptedException {if (Thread.interrupted())throw new InterruptedException();Node node = addConditionWaiter();int savedState = fullyRelease(node);int interruptMode = 0;while (!isOnSyncQueue(node)) {LockSupport.park(this);if ((interruptMode = checkInterruptWhileWaiting(node)) != 0)break;}if (acquireQueued(node, savedState) && interruptMode != THROW_IE)interruptMode = REINTERRUPT;if (node.nextWaiter != null) // clean up if cancelledunlinkCancelledWaiters();if (interruptMode != 0)reportInterruptAfterWait(interruptMode);
}private Node addConditionWaiter() {Node t = lastWaiter;// 如果尾节点已取消,清除队列中所有已取消的节点if (t != null && t.waitStatus != Node.CONDITION) {unlinkCancelledWaiters();t = lastWaiter;}Node node = new Node(Thread.currentThread(), Node.CONDITION);if (t == null)firstWaiter = node;elset.nextWaiter = node;lastWaiter = node;return node;
}

唤醒条件队列中的线程

public final void signal() {if (!isHeldExclusively())throw new IllegalMonitorStateException();Node first = firstWaiter;if (first != null)doSignal(first);
}private void doSignal(Node first) {do {if ( (firstWaiter = first.nextWaiter) == null)lastWaiter = null;first.nextWaiter = null;} while (!transferForSignal(first) &&(first = firstWaiter) != null);
}final boolean transferForSignal(Node node) {// 将节点的等待状态从 CONDITION 改为 0if (!compareAndSetWaitStatus(node, Node.CONDITION, 0))return false;// 将节点从条件队列转移到同步队列Node p = enq(node);int ws = p.waitStatus;if (ws > 0 || !compareAndSetWaitStatus(p, ws, Node.SIGNAL))LockSupport.unpark(node.thread);return true;
}

http://www.lryc.cn/news/580980.html

相关文章:

  • 淘客网站做的好的/软文文章
  • 自己做的网站访问速度慢/深圳网站设计
  • 深圳网站建设公司招聘/谷歌seo是什么
  • 专业的铁岭做网站公司/seo排名助手
  • 网站开发工作安排/最能打动顾客的十句话
  • java做电子政务网站系统/平台营销
  • 官渡区住房和城乡建设局网站/中国十大广告公司排行榜
  • 云伙伴公司客户案例/seo推广营销靠谱
  • 纵横网站/长沙百度搜索排名优化
  • 上海网站设计方案/免费的域名和网站
  • 兰州网站建设价/品牌运营
  • 正在备案怎么建网站/国外常用的seo站长工具
  • 用帝国cms做视频网站/网站推广平台搭建
  • 网站gbk 和utf8/公司关键词排名优化
  • 文档里网站超链接怎么做/域名解析查询工具
  • 如何做内网站的宣传栏/免费优化网站
  • 查网站备案信息/快手seo关键词优化
  • 石景山老山网站建设/如何开网店
  • 2016广州网站设计公司/镇江百度公司
  • 衢州做外贸网站的公司/辽阳网站seo
  • 网站创作/如何创建网站教程
  • 做电商网站需要会些什么条件/搜索引擎简称seo
  • 驰够网官方网站/网络营销策划书封面
  • 柳州网站建设公司/网站联盟营销
  • 做网站用什么cms 知乎/百度新闻首页
  • 达州网站建设qinsanw/数据分析网
  • 嵩县网站开发/网站优化课程培训
  • 唐山做企业网站/北京优化网站方法
  • 网页网站怎么做/新东方
  • 谷歌网站 百度/网络营销知名企业