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

临汾网站建设价格wordpress标题插件

临汾网站建设价格,wordpress标题插件,安卓开发课程,c 做网站怎么显示歌词前言 Java中大部分同步类#xff08;Lock、Semaphore、ReentrantLock等#xff09;都是基于AbstractQueuedSynchronizer#xff08;简称为 AQS#xff09;实现的。 AQS 是一种提供了原子式管理同步状态、阻塞和唤醒线程功能以及队列模型的简单框架。 本文会先介绍应用层Lock、Semaphore、ReentrantLock等都是基于AbstractQueuedSynchronizer简称为 AQS实现的。 AQS 是一种提供了原子式管理同步状态、阻塞和唤醒线程功能以及队列模型的简单框架。 本文会先介绍应用层再逐渐深入介绍原理层。通过介绍ReentrantLock 的基本特性和 ReentrantLock 与 AQS 的关联来深入解读 AQS 相关独占锁的知识点。 本篇文章主要阐述 AQS 中独占锁的逻辑和 Sync Queue 不包含共享锁和 Condition Queue 的部分本篇文章核心为 AQS 原理剖析只是简单介绍了 ReentrantLock感兴趣同学可以阅读一下 ReentrantLock 的源码。 下面列出本篇文章的大纲和思路以便于大家更好地理解 ReentrantLock ReentrantLock 与synchronized的区别和使用 ReentrantLock 意思为可重入锁指的是一个线程能够对一个临界资源重复加锁。为了帮助大家更好地理解 ReentrantLock 的特性我们先将 ReentrantLock 跟常用的 Synchronized 进行比较其特性如下蓝色部分为本篇文章主要剖析的点 ReentrantLockSynchronized锁实现机制依赖AQS监视器模式monitor灵活性支持响应中断、超时、尝试获取锁不灵活锁释放方式必须显式调用unloc()自动释放锁类型公平锁非公平锁非公平锁条件队列可关联多个条件队列关联一个可重入性可重入可重入 ReentrantLock public void test () throw Exception {// 1. 初始化选择公平锁、非公平锁ReentrantLock lock new ReentrantLock(true);// 2. 可用于代码块lock.lock();try {try {// 3. 支持多种加锁方式比较灵活 ; 具有可重入特性if(lock.tryLock(100, TimeUnit.MILLISECONDS)){ }} finally {// 4. 手动释放锁lock.unlock()}} finally {lock.unlock();} }Synchronized // **************************Synchronized 的使用方式 ************************** // 1. 用于代码块 synchronized (this) {} // 2. 用于对象 synchronized (object) {} // 3. 用于方法 public synchronized void test () {} // 4. 可重入 for (int i 0; i 100; i) {synchronized (this) {} } // **************************ReentrantLock 的使用方式 **************************ReentrantLock 与 AQS 的关联 我们知道ReentrantLock 支持公平锁和非公平锁并且 ReentrantLock的底层就是由 AQS 来实现的。那么 ReentrantLock 是如何利用AQS实现公平锁和非公平锁呢 我们着重从这两者的加锁过程来理解一下它们与 AQS 之间的关系加锁过程中与 AQS 的关联比较明显解锁流程后续会介绍 非公平锁源码中的加锁流程如下 // java.util.concurrent.locks.ReentrantLock#NonfairSync // 非公平锁 static final class NonfairSync extends Sync {...final void lock() {if (compareAndSetState(0, 1))setExclusiveOwnerThread(Thread.currentThread());elseacquire(1);}... }上述代码解释如下 若通过 CAS 设置变量 State同步状态成功也就是获取锁成功则将当前线程设置为独占线程。若通过 CAS 设置变量 State同步状态失败也就是获取锁失败则进入Acquire 方法进行后续处理。 但第二步获取锁失败后后续的处理策略是怎么样的呢这块可能会有以问题 某个线程获取锁失败的后续流程是什么呢有以下两种可能 将当前线程获锁结果设置为失败获取锁流程结束。 这种设计会极大降低系统的并发度并不满足我们实际的需求。所以就需要下面这种流程也就是AQS 框架的处理流程。 存在某种排队等候机制线程继续等待仍然保留获取锁的可能获取锁流程仍在继续。 对于问题 1 的第二种情况既然说到了排队等候机制那么就一定会有某种队列结构。 这种队列是什么数据结构呢处于排队等候机制中的线程什么时候可以有机会获取锁呢如果处于排队等候机制中的线程一直无法获取锁还是需要一直等待吗还是有别的策略来解决这一问题 带着非公平锁的这些问题再看下公平锁源码中获锁的方式 // java.util.concurrent.locks.ReentrantLock#FairSync static final class FairSync extends Sync {... final void lock() {acquire(1);}... }对这块代码我们可能会存在这种疑问Lock 函数通过 Acquire 方法进行加锁但是具体是如何加锁的呢 结合公平锁和非公平锁的加锁流程虽然流程上有一定的不同但是都调用了Acquire 方法而 Acquire 方法是 FairSync 和 UnfairSync 的父类 AQS 中的核心方法。 对于上边提到的问题其实在 ReentrantLock 类源码中都无法解答而这些问题的答案都在 Acquire 方法所在的类 AbstractQueuedSynchronizer 中也就是本文的核心——AQS。下面我们会对 AQS 以及ReentrantLock 和 AQS 的关联做详细介绍。 AQS 首先简单描述下 AQS 框架总的来说AQS 框架共分为五层 API层 锁获取方法层队列方法层排队方法层数据提供层 当有自定义同步器接入时只需重写第一层所需要的部分方法即可不需要关注底层具体的实现流程。 当自定义同步器进行加锁或者解锁操作时先经过第一层的 API 进入 AQS 内部方法然后经过第二层进行锁的获取接着对于获取锁失败的流程进入第三层和第四层的等待队列处理而这些处理方式均依赖于第五层的基础数据提供层。 下面我们会从整体到细节从流程到方法逐一剖析 AQS 框架主要分析过程 如下 原理概览 AQS 核心思想是 如果被请求的共享资源是空闲状态那么就将当前请求资源的线程设置为有效的工作线程将共享资源设置为锁定状态如果共享资源被占用了就需要一定的阻塞等待唤醒机制来保证锁分配。 这个机制主要用的是 CLH 队列的变体实现的将暂时获取不到锁的线程加入到队列中。 CLHCraig、Landin and Hagersten 队列是单向链表AQS 中的队列是CLH 变体的虚拟双向队列FIFO。 AQS 是通过将每条请求共享资源的线程封装成一个节点来实现锁的分配。 主要原理图如下 AQS 使用一个** Volatile 的 int 类型的成员变量来表示同步状态**通过内置的FIFO 队列来完成资源获取的排队工作通过 CAS 完成对 State 值的修改。 AQS 数据结构 这里先看下 AQS 中最基本的数据结构——NodeNode 即为上面 CLH 变体队列中的节点。 方法和属性值含义waitStatus当前节点在队列中的状态thread表示处于该节点的线程prev前驱指针predecessor返回前驱节点没有的话抛出 npenextWaiter指向下一个处于 CONDITION 状态的节点由于本文不讲述 Condition Queue 队列这个里不多介绍next后继指针 线程获取/等待的锁的两种模式 模式含义SHARED共享锁表示线程以共享的模式等待锁EXCLUSIVE独占锁表示线程正在以独占的方式等待锁 waitStatus 有下面几个枚举值 枚举含义0当一个 Node 被初始化的时候的默认值CANCELLED为 1表示线程获取锁的请求已经取消了CONDITION为 -2表示节点在等待队列中节点线程等待唤醒PROPAGATE为 -3当前线程处在 SHARED 情况下该字段才会使用SIGNAL为 -1表示线程已经准备好了就等资源释放了 同步状态 State 在了解数据结构后接下来了解一下 AQS 的同步状态——State。 AQS 中维护了一个** state 的字段意为同步状态是由 Volatile 修饰的用于展示当前临界资源的获锁情况**。 // java.util.concurrent.locks.AbstractQueuedSynchronizer private volatile int state;下面提供了几个访问这个字段的方法 方法名描述protected final int getState()获取 State 的值protected final void setState(int newState)设置 State 的值protected final boolean compareAndSetState(int expect, int update)使用 CAS 方式更新 State 这几个方法都是 Final 修饰的说明子类中无法重写它们。 我们可以通过修改 State 字段表示的同步状态来实现多线程的独占模式和共享模式加锁过程 独占模式 共享模式 如果我们要自定义的同步工具需要自定义获取同步状态和释放状态的方式也就 是 AQS 架构图中的第一层API 层。 参考了这里
http://www.dnsts.com.cn/news/134427.html

相关文章:

  • 网站开发 网络工程 哪个好网站建设公司排
  • 东莞网站建设找谁网站开发现在怎么样
  • 专业建设网站多少钱wordpress改变访问目录
  • 平台与网站有什么区别宣传片制作方案
  • 网站建设 就业方向简洁大气的网站模板
  • 从化网站建设公司编程教育机构
  • 关于建设学校网站策划书的范本用ps做网站首页顶部图片
  • 俱乐部网站 模板wordpress支持支付宝
  • 考证培训机构报名网站驻马店手机网站制作
  • 餐饮招商加盟网站建设费用合肥培训网站建设
  • 花瓣网是仿国外那个网站做的织梦对比wordpress
  • 个人网站是否需要备案小型企业网络拓扑图
  • wordpress备份整站鄂州市建设局网站
  • 最低成本做企业网站国内十大免费crm软件
  • 网站建设项目规划书社团宣传风景网页设计图片
  • 网站常用的蓝色企业网站托管排版设计
  • 建站大师阙梅娇简介wordpress农业模板
  • 网站建设需要的服务器网站快速优化排名软件
  • 商河网站建设在线解压zip网站
  • 浅析个人网站的设计论文设计北京
  • 系部网站开发计划书wordpress的多站点网站无法访问
  • 个人网站建设在哪里网页传奇私
  • 萍乡公司做网站网站cc攻击用什么来做
  • 做内部优惠券网站wordpress后台登陆美化
  • 厦门公司网站制作流程Wordpress 图片之间空隙
  • 网站的外部链接建设网站建设广告有哪些平台
  • 住房和城乡建设部网站打不开网站开发和软件开发哪个好
  • 网站内容建设要求age06华为通用软件开发工程师待遇
  • 云盘做网站文件我的家乡网页制作步骤
  • win7架设asp网站做网站用什么框架最方便