JUC之AQS的学习

AbstractQueuedSynchronizer

它是一个用于构建锁,同步器,协作工具列的工具,有了它这个基础类可以方便构建其它的线程协作工具类。比如countdownLatch,semaphore里都有内部类sync继承了AQS

AQS三大核心

state状态

  • 具体含义会根据不同实现的类不同的定义。比如在semaphore里,它表示剩余的许可证数量,在CountDownLatch里表示还需要倒数的数量。
  • state是被volatile修饰的会被并发的修改。所以所有修改的地方都需要保证线程安全。

控制线程抢锁和配合的FIFO队列

这个队列用来存放等待的线程。当多个线程来拿锁时,必须有排队机制将那些没能拿到锁的线程串在一起。当锁释放时,锁管理器就会挑选一个合适的线程占有刚刚释放的锁。

期望协作工具列实现的获取/释放等重要方法

获取操作依赖于state变量会发生阻塞

释放操作不会阻塞

AQS的用法

  1. 写一个工具类,想好协作的逻辑,实现获取、释放的方法,调用下面重写的获取释放方法
  2. 内部写一个sync继承AQS
  3. 根据是否独占来重写tryAcquire/tryRelase或tryAcquireShared(int acquires)/tryRelaseShared(int release)
package com.study.aqs;

import java.util.concurrent.locks.AbstractQueuedSynchronizer;

public class MyCountDownLatch {

    private final Sync sync = new Sync();

    public void await(){
        sync.tryAcquireShared(0);
    }

    public void singAll(){
        sync.tryReleaseShared(0);
    }

    private class Sync extends AbstractQueuedSynchronizer{


        @Override
        protected int tryAcquireShared(int arg) {
            //如果小于0则进入对列排队等待
           return getState() == 1? 1:-1;
        }

        @Override
        protected boolean tryReleaseShared(int arg) {
            setState(1);//如果为true则释放唤醒
            return true;
        }


    }

}

学习资料

美团技术团队《从ReentrantLock的实现看AQS的原理及应用》:https://mp.weixin.qq.com/s/sA01gxC4EbgypCsQt5pVog

老钱《打通 Java 任督二脉 —— 并发数据结构的基石》:https://juejin.im/post/5c11d6376fb9a049e82b6253 HongJie

《一行一行源码分析清楚AbstractQueuedSynchronizer》:https://javadoop.com/post/AbstractQueuedSynchronizer

爱吃鱼的KK《AbstractQueuedSynchronizer 源码分析 (基于Java 8)》:https://www.jianshu.com/p/e7659436538b waterystone

《Java并发之AQS详解》:https://www.cnblogs.com/waterystone/p/4920797.html

英文论文的中文翻译:https://www.cnblogs.com/dennyzhangdd/p/7218510.html

AQS作者的英文论文:http://gee.cs.oswego.edu/dl/papers/aqs.pdf

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值