队列同步器  AbstractQueuedSynchronizer,是用来构建锁或者其他同步组件的基础框架,它使用了一个int成员变量,通过内置的FIFO队列来完成资源获取线程的排队工作。

同步器的主要使用方式是继承,子类通过继承同步器并实现它的抽象方法来管理同步状态。

同步器是实现锁(任意同步组件)的的关键,在锁的实现中聚合同步器,利用同步器实现锁的语义。

同步器的设计是基于模板方法模式的,也就是说,使用者需要继承同步器并重写指定的方法,随后将同步器组合在自定义同步组件的实现中,并调用同步器提供的模板方法,而这些模板方法将会调用使用者重写的方法。getState()、setState(int newState)、compareAndSetState(int expect, int update)。

下面,通过独占锁的示例来深入了解同步器的工作原理:

 1 class Mutex implements Lock{
 2     //静态内部类,自定义同步器
 3     private static class Sync extends AbstractQueuedSynchronizer{
 4         //是否处于占用状态
 5         protected boolean isHeldExclusively(){
 6             return getState() == 1;
 7         }
 8         //当状态为0的时候获取锁
 9         public boolean tryAcquire(int acquires){
10             if (compareAndSetState(0,1)){
11                 setExclusiveOwnerThread(Thread.currentThread());//设置当前拥有独占访问的线程。null 参数表示没有线程拥有访问。
12                 return true;
13             }
14             return false;
15         }
16         //释放锁,将状态设置为0
17         protected boolean tryRelease(int releases){
18             if (getState() == 0) throw new IllegalMonitorStateException();
19             setExclusiveOwnerThread(null);
20             setState(0);
21             return true;
22         }
23         //返回一个Condition,每个condition都包含了一个condition队列
24         Condition newCondition(){return new ConditionObject();}
25     }
26     //仅需要将操作代理到Sync上即可
27     private final Sync sync = new Sync();
28     public void lock(){sync.acquire(1);}// 以独占模式获取对象,忽略中断。
29     public boolean tryLock(){return sync.tryAcquire(1);}
30     public void unlock(){sync.release(1);}
31     public Condition newCondition(){return sync.newCondition();}
32     public boolean isLocked(){return sync.isHeldExclusively();}
33     public boolean hasQueuedThreads(){return sync.hasQueuedThreads();}
34     public void lockInterruptibly() throws InterruptedException{
35         sync.acquireInterruptibly(1);
36     }
37     public boolean tryLock(long timeout, TimeUnit unit) throws InterruptedException{
38         return sync.tryAcquireNanos(1,unit.toNanos(timeout));
39     }
40 }

转载于:https://www.cnblogs.com/xcyz/p/8023492.html

队列同步器 AbstractQueuedSynchronizer相关推荐

  1. 【Java ASQ队列同步器实现原理】简单理解

    ASQ 1.概念 2.核心结构 3.实现原理 3.1 同步状态的获取 3.2 同步队列 3.3 独占式同步状态的获取 3.4 独占式同步状态的释放 1.概念 队列同步器AbstractQueuedSy ...

  2. 并发编程-15并发容器(J.U.C)核心 AbstractQueuedSynchronizer 抽象队列同步器AQS介绍

    文章目录 J.U.C脑图 J.U.C核心AQS简介 AQS底层数据结构 AQS特点 J.U.C脑图 为了体现出AQS和线程池的重要性,上图单独将AQS和线程池拿出来了. J.U.C的构成如下: J.U ...

  3. java同步队列_Java 中队列同步器 AQS(AbstractQueuedSynchronizer)实现原理

    前言 在 Java 中通过锁来控制多个线程对共享资源的访问,使用 Java 编程语言开发的朋友都知道,可以通过 synchronized 关键字来实现锁的功能,它可以隐式的获取锁,也就是说我们使用该关 ...

  4. java asq_ASQ(AbstractQueuedSynchronizer)队列同步器

    虽然synchronized提供了便捷性的隐式获取锁释放锁机制(基于JVM机制),但是它却缺少了获取锁与释放锁的可操作性,可中断.超时获取锁,且它为独占式在高并发场景下性能大打折扣.而ASQ,队列同步 ...

  5. 源码级深挖AQS队列同步器

    我们知道,在java中提供了两类锁的实现,一种是在jvm层级上实现的synchrinized隐式锁,另一类是jdk在代码层级实现的,juc包下的Lock显示锁,而提到Lock就不得不提一下它的核心队列 ...

  6. Java中的队列同步器AQS

    一.AQS概念 1.队列同步器是用来构建锁或者其他同步组件的基础框架,使用一个int型变量代表同步状态,通过内置的队列来完成线程的排队工作. 2.下面是JDK8文档中对于AQS的部分介绍 public ...

  7. Java中的锁---队列同步器

    2019独角兽企业重金招聘Python工程师标准>>> Lock接口 锁是用来控制多个线程访问共享资源的方式,一般来说,一个锁能够防止多个线程同时访问共享资源.Lock接口在使用时需 ...

  8. AQS抽象队列同步器原理详解

    系列文章目录 第一节 synchronized关键字详解-偏向锁.轻量级锁.偏向锁.重量级锁.自旋.锁粗化.锁消除 AQS抽象队列同步器原理详解 系列文章目录 前言 一.AQS特性 二.AQS原理 1 ...

  9. 并发——抽象队列同步器AQS的实现原理

    一.前言 这段时间在研究Java并发相关的内容,一段时间下来算是小有收获了.ReentrantLock是Java并发中的重要部分,所以也是我的首要研究对象,在学习它的过程中,我发现它是基于抽象队列同步 ...

最新文章

  1. 04号团队-团队任务5:项目总结会
  2. 序列比对软件/比对工具的比较
  3. Python 技术篇-利用pymouse库操作windows系统电脑实现鼠标指针移动、点击
  4. 【MPI高性能计算】用集合通信改进梯形求和积分
  5. 编程之美-子数组的最大乘机方法整理
  6. ionic ui框架及creator使用帮助
  7. (一)U盘安装ubuntu18.04.1
  8. C++基类与派生类的转换与多态性
  9. [js] 你有使用过pjax吗?它的原理是什么?
  10. 训练日志 2019.3.20
  11. emacs(考场+平时)配置方案
  12. JAVA深复制(深克隆)与浅复制(浅克隆)
  13. 华为举办HDC.Cloud媒体预沟通会,为开发者提供ICT“黑土地”
  14. Pig安装及简单使用(pig0.12.0 hadoop2.2.0)
  15. RouterOS 5.22固定公网IP共享上网设置
  16. Go语言:数组练习—冒泡排序
  17. 小甲鱼python官网-小甲鱼零基础入门学习Python
  18. h5游戏php语言什么意思,h5游戏是什么意思?
  19. HDU5144 NPY and shot BestCoder Round #22 1003
  20. 【GPU精粹与Shader编程】(二) 《GPU Gems 1》全书核心内容提炼总结 · 上篇

热门文章

  1. [控件] LabelView
  2. JAVA基础--final、static区别以及类加载顺序
  3. SpringMVC-方法四种类型返回值总结,你用过几种?
  4. Spring框架初写
  5. flink的DAG可视化使用(visualizer的使用)
  6. Gauss-Newton算法代码详细解释(转载+自己注释)
  7. anaconda 安装 pytorch
  8. Ext 入门 (05) 打印+gridpanel()方法
  9. 服务器维护,日志分析常用命令
  10. 阿里云ECS服务器磁盘空间异常,或者爆满