队列同步器 AbstractQueuedSynchronizer
队列同步器 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相关推荐
- 【Java ASQ队列同步器实现原理】简单理解
ASQ 1.概念 2.核心结构 3.实现原理 3.1 同步状态的获取 3.2 同步队列 3.3 独占式同步状态的获取 3.4 独占式同步状态的释放 1.概念 队列同步器AbstractQueuedSy ...
- 并发编程-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 ...
- java同步队列_Java 中队列同步器 AQS(AbstractQueuedSynchronizer)实现原理
前言 在 Java 中通过锁来控制多个线程对共享资源的访问,使用 Java 编程语言开发的朋友都知道,可以通过 synchronized 关键字来实现锁的功能,它可以隐式的获取锁,也就是说我们使用该关 ...
- java asq_ASQ(AbstractQueuedSynchronizer)队列同步器
虽然synchronized提供了便捷性的隐式获取锁释放锁机制(基于JVM机制),但是它却缺少了获取锁与释放锁的可操作性,可中断.超时获取锁,且它为独占式在高并发场景下性能大打折扣.而ASQ,队列同步 ...
- 源码级深挖AQS队列同步器
我们知道,在java中提供了两类锁的实现,一种是在jvm层级上实现的synchrinized隐式锁,另一类是jdk在代码层级实现的,juc包下的Lock显示锁,而提到Lock就不得不提一下它的核心队列 ...
- Java中的队列同步器AQS
一.AQS概念 1.队列同步器是用来构建锁或者其他同步组件的基础框架,使用一个int型变量代表同步状态,通过内置的队列来完成线程的排队工作. 2.下面是JDK8文档中对于AQS的部分介绍 public ...
- Java中的锁---队列同步器
2019独角兽企业重金招聘Python工程师标准>>> Lock接口 锁是用来控制多个线程访问共享资源的方式,一般来说,一个锁能够防止多个线程同时访问共享资源.Lock接口在使用时需 ...
- AQS抽象队列同步器原理详解
系列文章目录 第一节 synchronized关键字详解-偏向锁.轻量级锁.偏向锁.重量级锁.自旋.锁粗化.锁消除 AQS抽象队列同步器原理详解 系列文章目录 前言 一.AQS特性 二.AQS原理 1 ...
- 并发——抽象队列同步器AQS的实现原理
一.前言 这段时间在研究Java并发相关的内容,一段时间下来算是小有收获了.ReentrantLock是Java并发中的重要部分,所以也是我的首要研究对象,在学习它的过程中,我发现它是基于抽象队列同步 ...
最新文章
- 04号团队-团队任务5:项目总结会
- 序列比对软件/比对工具的比较
- Python 技术篇-利用pymouse库操作windows系统电脑实现鼠标指针移动、点击
- 【MPI高性能计算】用集合通信改进梯形求和积分
- 编程之美-子数组的最大乘机方法整理
- ionic ui框架及creator使用帮助
- (一)U盘安装ubuntu18.04.1
- C++基类与派生类的转换与多态性
- [js] 你有使用过pjax吗?它的原理是什么?
- 训练日志 2019.3.20
- emacs(考场+平时)配置方案
- JAVA深复制(深克隆)与浅复制(浅克隆)
- 华为举办HDC.Cloud媒体预沟通会,为开发者提供ICT“黑土地”
- Pig安装及简单使用(pig0.12.0 hadoop2.2.0)
- RouterOS 5.22固定公网IP共享上网设置
- Go语言:数组练习—冒泡排序
- 小甲鱼python官网-小甲鱼零基础入门学习Python
- h5游戏php语言什么意思,h5游戏是什么意思?
- HDU5144 NPY and shot BestCoder Round #22 1003
- 【GPU精粹与Shader编程】(二) 《GPU Gems 1》全书核心内容提炼总结 · 上篇