前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >AQS队列同步器

AQS队列同步器

作者头像
doper
发布于 2022-09-26 09:49:49
发布于 2022-09-26 09:49:49
20500
代码可运行
举报
运行总次数:0
代码可运行

AbstractQueuedSynchronizer(AQS)队列同步器

1. 什么是AQS

​ AQS主要用来构建或者其他同步器组件的基础框架,它使用了一个int成员变量表示同步状态,通过内置的FIFO队列来完成想获取资源的线程的排队工作。其主要使用方式是继承,子类通过继承它并实现它的抽象方法来管理同步状态,在管理同步状态的时候就需要对同步状态变量(int成员变量)进行修改,为了安全的修改同步状态变量就可以使用AQS已经提供的三个方法(getState()setState(int newState)compareAndSetState(int expect, int update))修改。AQS的子类被推荐定义为自定义同步组件的静态内部类,同步器自身没有实现任何同步接口,可以支持共享式地获取同步状态,可以方便实现不同的同步组件(ReentrantLock,ReentrantReadWriteLock和CountDownLatch等)。

​ 自定义的同步组件(如锁)是面向使用者的,使用者无需关心内部实现,而AQS面向同步组件的实现者的,简化组件的实现方式。

2. AQS接口

  1. AQS同步状态state state为0代表没有线程占有锁,可以去抢这个锁,用CAS设置state为非0,如果CAS成功说明抢到锁了,如果是可重入的话则state可以加1。 state非0代表有线程占有锁,解锁减去1直到state等于0代表释放锁。
  2. AQS的修改同步状态变量的三个方法
    • getState(): 获取当前的同步状态
    • setState(): 设置当前的同步状态
    • compareAndSetState(int expect, int update): 使用CAS设置当前状态,该方法能够保证状态设置的原子性。
  3. AQS可重写的方法 | 方法名称 | 描述 | | ———————————————————————- | —————————————————————————————— | | protected boolean tryAcquire(int arg) | 尝试以独占的方式获取同步状态,这个方法应该查询当前状态是否允许以独占模式获取它,如果允许则可以使用CAS设置同步状态。执行acquire方法的线程会调用此方法,如果此方法失败,则acquire方法可能会将线程排队(如果尚未排队),直到其他线程发出释放信号。这可以用来实现方法Lock.tryLock() | | protected boolean tryRelease(int arg) | 通过尝试修改同步状态变量以释放同步状态,执行release方法的线程会调用这个方法,等待获取同步状态的线程有机会获取同步状态。 | | protected int tryAcquireShared(int arg) | 以共享的方式获取同步状态,此方法应该查询当前状态是否允许以共享模式去获取它,返回大于等于0的值,表示获取成功,反之,获取失败。 | | protected boolean tryReleaseShared(int arg) | 以共享的方式释放同步状态 | | protected boolean isHeldExclusively() | 当前同步器是否在独占模式下被当前线程占用,即表示是否被当前线程所独占。 | 上面方法不重写的话默认实现是抛出UnsupportedOperationException异常
  4. AQS使用例子 在源码中附带了使用例子,具体代码如下:
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class Mutex implements Lock, java.io.Serializable {

    // 静态内部类
    // Our internal helper class
    private static class Sync extends AbstractQueuedSynchronizer {
        // Reports whether in locked state
        // 判断是否处于占用状态
        protected boolean isHeldExclusively() {
            return getState() == 1;
        }

        // Acquires the lock if state is zero
        public boolean tryAcquire(int acquires) {
            assert acquires == 1; // Otherwise unused
            if (compareAndSetState(0, 1)) {
                setExclusiveOwnerThread(Thread.currentThread());	//AQS中已定义的方法,设置当前拥有独占访问权限的是哪个线程
                return true;
            }
            return false;
        }

        // Releases the lock by setting state to zero
        protected boolean tryRelease(int releases) {
            assert releases == 1; // Otherwise unused
            if (getState() == 0) throw new IllegalMonitorStateException();
            setExclusiveOwnerThread(null);
            setState(0);
            return true;
        }

        // Provides a Condition
        Condition newCondition() {
            return new ConditionObject();
        }

        // Deserializes properly
        private void readObject(ObjectInputStream s)
                throws IOException, ClassNotFoundException {
            s.defaultReadObject();
            setState(0); // reset to unlocked state
        }
    }

    // 使用Sync完成相关的同步操作
    // The sync object does all the hard work. We just forward to it.
    private final Sync sync = new Sync();

    public void lock() {
        sync.acquire(1);
    }

    public boolean tryLock() {
        return sync.tryAcquire(1);
    }

    public void unlock() {
        sync.release(1);
    }

    public Condition newCondition() {
        return sync.newCondition();
    }

    public boolean isLocked() {
        return sync.isHeldExclusively();
    }

    public boolean hasQueuedThreads() {
        return sync.hasQueuedThreads();
    }

    public void lockInterruptibly() throws InterruptedException {
        sync.acquireInterruptibly(1);
    }

    public boolean tryLock(long timeout, TimeUnit unit)
            throws InterruptedException {
        return sync.tryAcquireNanos(1, unit.toNanos(timeout));
    }
}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022-05-21,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
R语言股票市场指数:ARMA-GARCH模型和对数收益率数据探索性分析|附代码数据
最近我们被客户要求撰写关于ARMA-GARCH的研究报告,包括一些图形和统计输出。
拓端
2023/02/21
1.1K0
R语言: GARCH模型股票交易量的研究道琼斯股票市场指数|附代码数据
我将建立道琼斯工业平均指数(DJIA)日交易量对数比的ARMA-GARCH模型。 ``
拓端
2023/09/12
3080
R语言用多元ARMA,GARCH ,EWMA, ETS,随机波动率SV模型对金融时间序列数据建模|附代码数据
本文将说明单变量和多变量金融时间序列的不同模型,特别是条件均值和条件协方差矩阵、波动率的模型
拓端
2023/05/06
4700
R语言股票市场指数:ARMA-GARCH模型和对数收益率数据探索性分析|附代码数据
本文将分析工业指数(DJIA)。工业指数(DIJA)是一个股市指数,表明30家大型上市公司的价值。工业指数(DIJA)的价值基于每个组成公司的每股股票价格之和(点击文末“阅读原文”获取完整代码数据)。
拓端
2022/11/01
6930
R语言多元(多变量)GARCH :GO-GARCH、BEKK、DCC-GARCH和CCC-GARCH模型和可视化|附代码数据
从Engle在1982发表自回归条件异方差(ARCH)模型的论文以来,金融时间序列数据的波动性就倍受关注。同时,近几年又出现了研究股票市场的波动传递性
拓端
2023/01/12
1.5K0
R语言基于ARMA-GARCH-VaR模型拟合和预
本文显示了如何基于潜在的ARMA-GARCH过程(当然也涉及更广泛意义上的QRM)来拟合和预测风险价值(VaR)。
拓端
2020/11/19
1.1K0
R语言基于ARMA-GARCH-VaR模型拟合和预
时间序列GARCH模型分析股市波动率
在这篇文章中,我们将学习一种在价格序列中建立波动性模型的标准方法,即广义自回归条件异方差(GARCH)模型。
拓端
2022/03/11
2.6K0
时间序列GARCH模型分析股市波动率
R语言HAR和HEAVY模型分析高频金融数据波动率|附代码数据
在本文中,在学术界和金融界,分析高频财务数据的经济价值现在显而易见。(点击文末“阅读原文”获取完整代码数据)
拓端
2022/11/04
7810
R语言基于ARMA-GARCH-VaR模型拟合和预测实证研究分析案例
本文显示了如何基于潜在的ARMA-GARCH过程(当然也涉及更广泛意义上的QRM)来拟合和预测风险价值(VaR)。
拓端
2020/11/11
1K0
R语言基于ARMA-GARCH-VaR模型拟合和预测实证研究分析案例
R语言具有Student-t分布改进的GARCH(1,1)模型的贝叶斯估计|附代码数据
本说明介绍使用Student-t改进的GARCH(1,1)模型对汇率对数收益进行贝叶斯估计。
拓端
2023/09/13
2690
深度 | 在 R 中估计 GARCH 参数存在的问题
本文翻译自《Problems In Estimating GARCH Parameters in R 》
量化投资与机器学习微信公众号
2019/02/26
6.8K0
ARMA-EGARCH模型、集成预测算法对SPX实际波动率进行预测|附代码数据
本文比较了几个时间序列模型,以预测SP500指数的每日实际波动率。基准是SPX日收益序列的ARMA-EGARCH模型。将其与GARCH模型进行比较  。最后,提出了集合预测算法 。
拓端
2022/11/15
5470
R语言中的时间序列分析模型:ARIMA-ARCH / GARCH模型分析股票价格|附代码数据
时间序列分析是统计学中的一个主要分支,主要侧重于分析数据集以研究数据的特征并提取有意义的统计信息来预测序列的未来值
拓端
2022/12/21
1.4K0
R语言单变量和多变量(多元)动态条件相关系数DCC-GARCH模型分析股票收益率金融时间序列数据波动率
当您处理金融时间序列时,我们通常可以获得相对高频的观察结果。例如,每天进行观察是很常见的。事实上,现在可以获得每小时、分钟、秒甚至毫秒的观测值。
拓端
2025/03/28
1040
R语言单变量和多变量(多元)动态条件相关系数DCC-GARCH模型分析股票收益率金融时间序列数据波动率
R语言GARCH族模型:正态分布、t、GED分布EGARCH、TGARCH的VaR分析股票指数
VaR方法作为当前业内比较流行的测量金融风险的方法,具有简洁,明了的特点,而且相对于方差来讲,更多的将投资人的损失作为风险具有更好的合理性。
拓端
2022/12/23
7440
R语言用GARCH模型波动率建模和预测、回测风险价值 (VaR)分析股市收益率时间序列|附代码数据
风险价值 (VaR) 是金融风险管理中使用最广泛的市场风险度量,也被投资组合经理等从业者用来解释未来市场风险
拓端
2023/02/23
1.3K0
Python金融时间序列模型ARIMA 和GARCH 在股票市场预测应用|附代码数据
这篇文章讨论了自回归综合移动平均模型 (ARIMA) 和自回归条件异方差模型 (GARCH) 及其在股票市场预测中的应用
拓端
2023/01/13
1.8K0
R语言中的时间序列分析模型:ARIMA-ARCH / GARCH模型分析股票价格
最近我们被客户要求撰写关于ARIMA-ARCH / GARCH预测的研究报告,包括一些图形和统计输出。时间序列分析是统计学中的一个主要分支,主要侧重于分析数据集以研究数据的特征并提取有意义的统计信息来预测序列的未来值
拓端
2022/12/06
1.5K0
推荐阅读
R语言股票市场指数:ARMA-GARCH模型和对数收益率数据探索性分析|附代码数据
1.1K0
R语言: GARCH模型股票交易量的研究道琼斯股票市场指数|附代码数据
3080
R语言用多元ARMA,GARCH ,EWMA, ETS,随机波动率SV模型对金融时间序列数据建模|附代码数据
4700
R语言股票市场指数:ARMA-GARCH模型和对数收益率数据探索性分析|附代码数据
6930
R语言多元(多变量)GARCH :GO-GARCH、BEKK、DCC-GARCH和CCC-GARCH模型和可视化|附代码数据
1.5K0
R语言基于ARMA-GARCH-VaR模型拟合和预
1.1K0
时间序列GARCH模型分析股市波动率
2.6K0
R语言HAR和HEAVY模型分析高频金融数据波动率|附代码数据
7810
R语言基于ARMA-GARCH-VaR模型拟合和预测实证研究分析案例
1K0
R语言具有Student-t分布改进的GARCH(1,1)模型的贝叶斯估计|附代码数据
2690
深度 | 在 R 中估计 GARCH 参数存在的问题
6.8K0
ARMA-EGARCH模型、集成预测算法对SPX实际波动率进行预测|附代码数据
5470
R语言中的时间序列分析模型:ARIMA-ARCH / GARCH模型分析股票价格|附代码数据
1.4K0
R语言单变量和多变量(多元)动态条件相关系数DCC-GARCH模型分析股票收益率金融时间序列数据波动率
1040
R语言GARCH族模型:正态分布、t、GED分布EGARCH、TGARCH的VaR分析股票指数
7440
R语言用GARCH模型波动率建模和预测、回测风险价值 (VaR)分析股市收益率时间序列|附代码数据
1.3K0
Python金融时间序列模型ARIMA 和GARCH 在股票市场预测应用|附代码数据
1.8K0
R语言中的时间序列分析模型:ARIMA-ARCH / GARCH模型分析股票价格
1.5K0
相关推荐
R语言股票市场指数:ARMA-GARCH模型和对数收益率数据探索性分析|附代码数据
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档