首页 > 其他分享 >AQS解析

AQS解析

时间:2024-08-15 18:06:22浏览次数:11  
标签:node AQS 队列 lock private items 解析 final

关键信息 state(volatile修饰)/双向链表数据结构 AQS有那些实现? ReentrantLock、Semaphore、CountDownLatch  AQS分为同步队列和条件队列 public class BoundedBuffer<T> {  
    private final Lock lock = new ReentrantLock();  
    private final Condition notFull = lock.newCondition();  
    private final Condition notEmpty = lock.newCondition();  
    private final Object[] items = new Object[10];  
    private int putpos = 0;  
    private int takepos = 0;  
    private int count = 0;  
  
    public void put(T x) throws InterruptedException {  
        lock.lock();  
        try {  
            while (count == items.length) {  
                notFull.await(); // 等待缓冲区不满  
            }  
            items[putpos] = x;  
            if (++putpos == items.length) putpos = 0;  
            ++count;  
            notEmpty.signal(); // 通知等待的消费者  
        } finally {  
            lock.unlock();  
        }  
    }  
  
    public T take() throws InterruptedException {  
        lock.lock();  
        try {  
            while (count == 0) {  
                notEmpty.await(); // 等待缓冲区不为空  
            }  
            T x = (T) items[takepos];  
            items[takepos] = null;  
            if (++takepos == items.length) takepos = 0;  
            --count;  
            notFull.signal(); // 通知等待的生产者  
            return x;  
        } finally {  
            lock.unlock();  
        }  
    }  
    同步队列如何实现的? 是通过ConditionObject实现的,里面个双向队列

public class ConditionObject implements Condition, java.io.Serializable {
    private static final long serialVersionUID = 1173984872572414699L;
    /** First node of condition queue. */
    private transient Node firstWaiter;
    /** Last node of condition queue. */
    private transient Node lastWaiter;
 
public final void await() throws InterruptedException {
    if (Thread.interrupted())
        throw new InterruptedException();
    
    //将当前线程加入等待队列
    Node node = addConditionWaiter();
    
    //释放当前的锁
    long savedState = fullyRelease(node);
    int interruptMode = 0;
    
    //不在同步队列,则继续等待
    while (!isOnSyncQueue(node)) {
        LockSupport.park(this);
        if ((interruptMode = checkInterruptWhileWaiting(node)) != 0)
            break;
    }
    
    //将线程加入到等待队列
    if (acquireQueued(node, savedState) && interruptMode != THROW_IE)
        interruptMode = REINTERRUPT;
    if (node.nextWaiter != null) // clean up if cancelled
        unlinkCancelledWaiters();
    if (interruptMode != 0)
        reportInterruptAfterWait(interruptMode);
}
public final void signal() {
    if (!isHeldExclusively())
        throw new IllegalMonitorStateException();
    
    //获取队列首个节点
    Node first = firstWaiter;
    if (first != null)

        //唤醒队首线程
        doSignal(first);
}

 

标签:node,AQS,队列,lock,private,items,解析,final
From: https://www.cnblogs.com/jichenghui/p/18361521

相关文章

  • JSONUtil、JsonArray应用 (全网最全面的解析方式汇总) - 调用第三方接口后,获取的结果
    背景:近期开发的内容涉及到了我们平台对其他平台提供接口的调用,然后也涉及到接口提供方的验签等操作;还有我们的加签操作等。今天记录一下调用三方接口后返回的接口如何解析;怎么拿到自己想要的东西。其实调用三方接口分为几步1、采用哪种方式调用三方接口,这种依赖于第三方......
  • C语言中的操作符:深入解析与应用
    引言C语言提供了丰富的操作符,用于执行算术运算、逻辑判断、位操作等。这些操作符是编程语言中的基础构件,它们使得程序能够进行复杂的数据处理和逻辑控制。本文将详细介绍C语言中的各种操作符,包括它们的类型、用法和一些实际应用示例。操作符的分类算术操作符算术操作符用于......
  • Windows通过dynv6提供免费的IPv6动态域名解析(DDNS)服务(注册服务的方式运行)
    Dynv6IPv6Updater项目简介特性使用方法环境依赖运行脚本参数说明示例日志输出Windows服务注册步骤1:下载并安装NSSM步骤2:准备Python环境和脚本步骤3:使用NSSM注册服务步骤4:启动服务并验证步骤5:设置日志记录(可选)步骤6:重启系统并验证附:以下为帮......
  • 基于Nexus实现配置阿里云代理仓库过程解析
    基于Nexus实现配置阿里云代理仓库过程解析更新时间:2020年07月09日09:19:07  作者:咔咔kk 这篇文章主要介绍了基于Nexus实现配置阿里云代理仓库过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下Nexus默认远程仓......
  • ThreadLocal源码解析
    ThreadLocal有内部类ThreadLocalMap,ThreadLocalMap是ThreadLocal的核心1.每个线程下的有一个ThreadLocalMapstaticclassThreadLocalMap{staticclassEntryextendsWeakReference<ThreadLocal<?>>{Objectvalue;Entry(ThreadLocal<?>k,Ob......
  • 探索Gradle:现代化构建工具的深入解析
    目录引言Gradle简介Gradle的安装与配置Gradle的基础概念项目与任务构建脚本依赖管理Gradle构建生命周期初始化阶段配置阶段执行阶段常用Gradle命令Gradle与Maven的对比Gradle插件常见插件自定义插件Gradle的高级特性多项目构建构建缓存持续集成Gradle最佳实践总结......
  • 大模型面试题库精华:100道经典问题解析
    ↓推荐关注↓算法暑期实习机会快结束了,校招大考即将来袭。当前就业环境已不再是那个双向奔赴时代了。求职者在变多,岗位在变少,要求还更高了。最近,我们陆续整理了很多大厂的面试题,帮助网友解惑答疑和职业规划,分享了面试中的那些弯弯绕绕。喜欢本文记得收藏、关注、点赞,更......
  • 深入解析SVG 标签的 viewBox属性(超详细)
    解析SVG标签的viewBox属性案情提要相信小伙伴们在学习svg标签的viewBox属性时候,无论是看w3cschool还是MDN的官方文档,都是一头雾水。比如MDN给出的解释:viewBox属性允许指定一个给定的一组图形伸展以适应特定的容器元素。viewBox属性的值是一个包含4个参数的列表......
  • 植入式可编程微型电流刺激器解决方案之软件架构解析
    前记 微电流刺激仪,是指利用低强度特定波形电流刺激大脑、下丘脑、边缘网状结构,调节大脑兴奋性,治疗失眠、焦虑或缓解症状。随着近些年新的医疗方式和科学研究的不断深入。这类技术在生物学以及医疗健康领域变得愈加重要了。笔者团队有幸参与了国内一家科研项目,并把该设备做成实......
  • 深入解析Spring Boot中的@ConfigurationProperties注解
    深入解析SpringBoot中的@ConfigurationProperties注解在SpringBoot框架中,配置管理是一个核心功能。SpringBoot提供了多种方式来处理外部配置,其中@ConfigurationProperties注解是一个非常强大且灵活的工具。本文将深入探讨@ConfigurationProperties注解的概念、用法、工......