位置: IT常识 - 正文

Java多线程(6):锁与AQS(中)

编辑:rootadmin
您好,我是湘王,这是我的博客园,欢迎您来,欢迎您再来~ Java中的AQS(AbstractQueuedSynchronizer,抽象队列同步器)是用来实现锁及其他同步功能组件的Java底层技术基础,java.util.concurrent包下大部分类的实现都离不开它。 通过继承AQS: 1、Ree ...

推荐整理分享Java多线程(6):锁与AQS(中),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:,内容如对您有帮助,希望把文章链接给更多的朋友!

您好,我是湘王,这是我的博客园,欢迎您来,欢迎您再来~

Java中的AQS(AbstractQueuedSynchronizer,抽象队列同步器)是用来实现锁及其他同步功能组件的Java底层技术基础,java.util.concurrent包下大部分类的实现都离不开它。

通过继承AQS:

1、ReentrantLock的内部类实现了公平锁和非公平锁;

2、CountDownLatch的内部类实现了发令枪;

3、ReentrantReadWriteLock的内部类实现了独享锁和共享锁;

4、Semaphore的内部类实现了公平锁和非公平锁。

AQS主要实现两大功能:独占(Exclusive,有时也叫排他)和共享(Share)。

AQS在内部维护一个FIFO(First In First Out,先进先出)的CLH(Craig,Landin,and Hagersten)线程阻塞队列和一个资源同步状态的变量volatile int state。

CLH是一个虚拟的双向队列,也就是不存在队列实例,仅存在节点之间的关联关系的队列。AQS是将每一条请求共享资源的线程,封装成一个CLH线程队列节点(Node),从而实现锁的分配。因此,说了一大堆,用一句简单的话来形容AQS就是:基于CLH线程阻塞队列,通过volatile变量 + CAS + 自旋方式来改变线程状态,成功则获取锁,失败则进入CLH队列。

Java多线程(6):锁与AQS(中)

AQS已经实现了CLH线程阻塞队列的维护,所以一般子类自定义实现AQS,要么是独占,要么是共享,也就是要么实现tryAcquire()和tryRelease()等系列方法,要么实现tryAcquireShared()和tryReleaseShared()等系列方法。

CLH队列由多个node节点组成,而且大量使用“CAS自旋volatile变量”这种经典代码:

CLH队列的结构为:

给CLH设置首节点:

给CLH设置尾节点:

整个AQS的流程如图:

AQS特别复杂,如果想把多线程搞透的,就需要深入研究每个方法的流程,拿acquire(int)方法的执行流程为例:

我把AQS的源码做了较为详细的注释,可以结合注释看看。例如:

/** * Provides a framework for implementing blocking locks and related * synchronizers (semaphores, events, etc) that rely on first-in-first-out * (FIFO) wait queues. 提供了一个实现阻塞锁和依赖FIFO的等待队列的相关的同步器(信号灯、事件等)框架 * * This class is designed to be a useful basis for most kinds of synchronizers * that rely on a single atomic {@code int} value to represent state. * 这个类对于大多数使用一个单独原子类的int值来表示状态的同步器很有用 * * Subclasses must define the protected methods that change this state, and * which define what that state means in terms of this object being acquired or * released. 子类必须定义protected方法来改变这个状态值,并且定义状态值是获取还是释放对象 * * Given these, the other methods in this class carry out all queuing and * blocking mechanics. 鉴于此,这个类中的其他方法实现了所有排队和阻塞的机制 * * Subclasses can maintain other state fields, but only the atomically updated * {@code int} value manipulated using methods {@link #getState}, * {@link #setState} and {@link #compareAndSetState} is tracked with respect to * synchronization. 子类可以维护其他的状态值字段,但只有getState、setState和compareAndSetState * 方法是通过原子更新来实现同步的 * * <p> * Subclasses should be defined as non-public internal helper classes that are * used to implement the synchronization properties of their enclosing class. * 子类应该定义成非public的内部helper工具类,用于实现其封闭类的同步属性 * * Class {@code AbstractQueuedSynchronizer} does not implement any * synchronization interface. AbstractQueuedSynchronizer类没有实现任何同步接口 * * Instead it defines methods such as {@link #acquireInterruptibly} that can be * invoked as appropriate by concrete locks and related synchronizers to * implement their public methods. * 取而代之的是,它定义了像acquireInterruptibly这样的方法,通过调用恰当的具体 锁和相关同步器方法,以便实现他们自己的公共方法 * * <p> * This class supports either or both a default <em>exclusive</em> mode and a * <em>shared</em> mode. 这个类既支持默认的独占模式,也支持共享模式,也支持两种模式一起实现 * * When acquired in exclusive mode, attempted acquires by other threads cannot * succeed. 当在独占模式获取到锁时,其他线程再尝试获取锁会失败 * * Shared mode acquires by multiple threads may (but need not) succeed. * 共享模式,多个线程都能成功获取到锁 * * This class does not understand these differences except in the mechanical * sense that when a shared mode acquire succeeds, the next waiting thread (if * one exists) must also determine whether it can acquire as well. * 这个类不会理解机制的不同,共享模式中的一个线程获取锁成功了,下一个线程 (如果存在)仍然会去确定它自己是否也可以获取 * * Threads waiting in the different modes share the same FIFO queue. * 线程虽在不同的模式中,却都在等待共享相同的FIFO队列 * * Usually, implementation subclasses support only one of these modes, but both * can come into play for example in a {@link ReadWriteLock}. * 通常,子类只需要实现这两种模式中的一种,但也能两种都实现,例如ReadWriteLock * * Subclasses that support only exclusive or only shared modes need not define * the methods supporting the unused mode. 仅支持一种模式的子类,不必定义另一种模式下的方法 * * <p> * This class defines a nested {@link ConditionObject} class that can be used as * a {@link Condition} implementation by subclasses supporting exclusive mode * for which method {@link#isHeldExclusively} reports whether synchronization is * exclusively held with respect to the current thread, method {@link #release} * invoked with the current {@link #getState} value fully releases this object, * and {@link #acquire}, given this saved state value, eventually restores this * object to its previous acquired state. * 这个类定义了一个嵌套的ConditionObject类,该类可以被支持独占模式的子类用作 * Condition实现,为此,isHeldExclusively()报告当前线程是否持续保持同步, * release方法通过调用getState来完全释放当前对象,并且将当前的资源状态 再保存到state中,最后会将此对象恢复为先前的获取状态 * * No {@code AbstractQueuedSynchronizer} method otherwise creates such a * condition, so if this constraint cannot be met, do not use it. * 没有AbstractQueuedSynchronizer方法去创建condition,因此如果不能满足 这个约束,就不要使用它 * * The behavior of {@link ConditionObject} depends of course on the semantics of * its synchronizer implementation. ConditionObject的行为依赖于其同步器实现的语义 * * <p> * This class provides inspection, instrumentation, and monitoring methods for * the internal queue, as well as similar methods for condition objects. * 这个类提供检查、追踪和监控内部队列的方法,类似于condition对象的方法 * * These can be exported as desired into classes using an * {@code AbstractQueuedSynchronizer} for their synchronization mechanics. * 可以根据需要使用AbstractQueuedSynchronizer,将它们导入到类中以实现其同步机制 * * <p> * Serialization of this class stores only the underlying atomic integer * maintaining state, so deserialized objects have empty thread queues. * 这个类仅序列化state的原子值,因此反序列化出来的对象中的线程队列是空的 * * Typical subclasses requiring serializability will define a {@code readObject} * method that restores this to a known initial state upon deserialization. * 需要序列化的子类可以在反序列化的时候定义一个readObject方法来恢复已知的初始状态 * * * <h3>Usage</h3> 使用 * * <p> * To use this class as the basis of a synchronizer, redefine the following * methods, as applicable, by inspecting and/or modifying the synchronization * state using {@link #getState}, {@link #setState} and/or * {@link #compareAndSetState}: 使用这个类作为同步器锁,需要重新定义以下方法: * * <ul> * <li>{@link #tryAcquire} * <li>{@link #tryRelease} * <li>{@link #tryAcquireShared} * <li>{@link #tryReleaseShared} * <li>{@link #isHeldExclusively} * </ul> * * Each of these methods by default throws * {@link UnsupportedOperationException}. * 这些方法默认抛出UnsupportedOperationException异常 * * Implementations of these methods must be internally thread-safe, and should * in general be short and not block. 这些方法的实现必须在内部是线程安全的,而且通常都很简短,没有阻塞 * * Defining these methods is the <em>only</em> supported means of using this * class. 定义这些方法是使用这个类唯一可行的方式 * * All other methods are declared {@code final} because they cannot be * independently varied. 所有其他的方法都被
本文链接地址:https://www.jiuchutong.com/zhishi/304134.html 转载请保留说明!

上一篇:phpcms如何更换模板(phpcms怎么用)

下一篇:帝国cms怎么替换网址域名(帝国cms怎么用)

  • 荣耀怎么设置地震报警(荣耀怎么设置地震预警强度)

    荣耀怎么设置地震报警(荣耀怎么设置地震预警强度)

  • 苹果11微信变成黑色怎么改回来(苹果11微信变成黑色了)

    苹果11微信变成黑色怎么改回来(苹果11微信变成黑色了)

  • 华为nova7负一屏如何关闭(华为nova7负一屏怎么设置)

    华为nova7负一屏如何关闭(华为nova7负一屏怎么设置)

  • 吉比特无源光纤接入用户端设备是路由器吗(吉比特无源光纤接入设备)

    吉比特无源光纤接入用户端设备是路由器吗(吉比特无源光纤接入设备)

  • 钉钉的员工健康统计能自己增加吗(钉钉员工健康打卡表单已超过截止时间无法提交)

    钉钉的员工健康统计能自己增加吗(钉钉员工健康打卡表单已超过截止时间无法提交)

  • 拍立得能用南孚电池吗(拍立得用南孚电池会坏吗)

    拍立得能用南孚电池吗(拍立得用南孚电池会坏吗)

  • 苹果8玩一会儿就发烫(苹果8玩一会儿屏幕变暗)

    苹果8玩一会儿就发烫(苹果8玩一会儿屏幕变暗)

  • qq冰淇淋标识是什么意思(qq冰淇淋图标是什么)

    qq冰淇淋标识是什么意思(qq冰淇淋图标是什么)

  • 华为nova6se微信怎么开美颜(华为nova6se微信怎么分身)

    华为nova6se微信怎么开美颜(华为nova6se微信怎么分身)

  • qq好友头像全部变成狗头(qq好友头像全部变成动态了)

    qq好友头像全部变成狗头(qq好友头像全部变成动态了)

  • 手机微信背景色变成黑色了怎么办(手机微信背景颜色)

    手机微信背景色变成黑色了怎么办(手机微信背景颜色)

  • vivo手机出现虚电怎么解决(vivo手机有虚电怎样才能恢复正常)

    vivo手机出现虚电怎么解决(vivo手机有虚电怎样才能恢复正常)

  • wifi微信可以用但网页视频打不开(wifi微信可以用视频看不了)

    wifi微信可以用但网页视频打不开(wifi微信可以用视频看不了)

  • 怎么把表格存到桌面(怎么把表格存到新建的文件夹里)

    怎么把表格存到桌面(怎么把表格存到新建的文件夹里)

  • 微信从黑名单恢复好友,对方有通知吗(微信从黑名单恢复能收到以前的信息吗)

    微信从黑名单恢复好友,对方有通知吗(微信从黑名单恢复能收到以前的信息吗)

  • 手机前面的小孔是什么(手机前面的小孔进水怎么办)

    手机前面的小孔是什么(手机前面的小孔进水怎么办)

  • 苹果闹钟里面的就寝怎么删除(苹果闹钟里面的重复是啥意思)

    苹果闹钟里面的就寝怎么删除(苹果闹钟里面的重复是啥意思)

  • qq音乐积分有什么用(qq音乐积分商城可信吗)

    qq音乐积分有什么用(qq音乐积分商城可信吗)

  • 抖音文字描述显示不全(抖音上传视频文字描述)

    抖音文字描述显示不全(抖音上传视频文字描述)

  • 迅雷影音如何关掉弹幕(迅雷影音如何关闭原始字幕)

    迅雷影音如何关掉弹幕(迅雷影音如何关闭原始字幕)

  • 微博数据中心如何查看(微博 数据中心)

    微博数据中心如何查看(微博 数据中心)

  • oppo k3出厂自带贴膜么(oppok3出厂系统)

    oppo k3出厂自带贴膜么(oppok3出厂系统)

  • vivoz5x是玻璃后盖吗(vivoz5手机背面玻璃摔碎照片)

    vivoz5x是玻璃后盖吗(vivoz5手机背面玻璃摔碎照片)

  • AquariumDesktop.exe进程危险吗 AquariumDesktop是什么进程

    AquariumDesktop.exe进程危险吗 AquariumDesktop是什么进程

  • u盘显示0字节修复教程(u盘显示0字节修改不了)

    u盘显示0字节修复教程(u盘显示0字节修改不了)

  • 如何配置openai的返回Stream数据并转发到h5页面按markdown格式流式输出(怎么配置opencv)

    如何配置openai的返回Stream数据并转发到h5页面按markdown格式流式输出(怎么配置opencv)

  • win11系统中怎样开启无线投屏? win11添加无线显示器的技巧(win11系统中怎样调整office底色)

    win11系统中怎样开启无线投屏? win11添加无线显示器的技巧(win11系统中怎样调整office底色)

  • mysql联合查询是什么(mysql的联合查询)

    mysql联合查询是什么(mysql的联合查询)

  • 税控盘维护费会计分录怎么写
  • 转出未交增值税年末怎么转平
  • 人民币报关可以吗
  • 坏账准备的账务处理4步
  • 税款追征期起算点 增值税重新计算
  • 买一赠一视同销售征收增值税吗
  • 以存货抵偿债务结转的相关存货跌价准备
  • 可供出售金融资产新准则叫什么
  • 装修费可以一次性计入费用吗
  • 用友软件作废凭证
  • 公司银行利息要交税吗
  • 私车公用油费计入什么科目
  • 增值税扣款凭证包括
  • 股权转让的印花税是按照什么金额缴纳
  • 机票的抵扣率是多少
  • 以不动产对外投资要交什么税
  • 企业所得税三项费用扣除
  • 三个点的专票要交多少税
  • 企业的银行利息收入要交企业所得税吗
  • 库存商品结转成本
  • Win7系统中如何快速查询文件内容
  • 权益法初始入账价值和初始投资成本
  • php反序列化pop链
  • 房屋租赁进项税
  • 工地包工工程款一般怎么结
  • 金银首饰在哪个软件买
  • php://filter协议
  • 增值税加计抵减申报表怎么填
  • php处理数据
  • php读取数据输出html
  • 使用小程序实现im
  • gpib-usb驱动
  • 织梦cms官网
  • phpcms生成html
  • 怎么摊销租金
  • 无形资产减值准备可以转回吗
  • 扣除公积金分录
  • 非盈利组织捐赠物资收入账务处理流程
  • 销售折扣现金流量表
  • 外经证开错作废要带些什么
  • 销售货物未收到货款的会计分录怎么写
  • 作废的发票也要交印花税吗
  • 厂房出租没有开发票属于违法吗?
  • 人工费用和制造费用的约当产量
  • 暂估入库后发票来不了
  • 公司注销后退资需要交税吗
  • 账务处理程序的种类及各自的适用范围
  • 公司是生产企业现在要开出租赁的发票可以开吗
  • 当月财务费用怎么算
  • 建筑企业合理避税
  • 待清算商户款项分录的摘要是什么
  • 存在弃置费用的固定资产例题
  • 年终奖通常怎么计算
  • freebsd联网
  • storm run off
  • centos安装位置选择
  • explorer.exe进程被结束怎么恢复
  • ubuntu如何打开
  • win10系统出现蓝色框框
  • iphone手机文件怎么传到电脑
  • win8怎样设置将文件保存到d盘
  • win7无法注册dll文件
  • linux下忘记mysql密码的几种找回方法(推荐)
  • 2015-04-08---cocos2dx一个都不能死(含源码)
  • jQuery实现ctrl+enter(回车)提交表单
  • Animation.setFillAfter and Animation.setFillBefore的作用
  • android学习路线
  • button按钮类型
  • 本地 node js 启动vue
  • PreferenceActivity、PreferenceFragment使用
  • javascript.
  • 深入理解新发展理念,推进供给侧结构性改革
  • 莱鸟人集团
  • 浅谈自己对教育的理解
  • 企业自产自销农产品免税政策有哪些
  • 四川省国税局一处处长
  • 单位纪检员和纪检委员区别
  • 漳州市税务局电话多少
  • 利润表中所得税费用包括
  • 2o21年公租房
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设