Java并发包下锁学习第二篇Java并发基础框架-队列同步器介绍
Java并发包下锁学习第二篇队列同步器
还记得在第一篇文章中,讲到的locks包下的类结果图吗?如下图:
从图中,我们可以看到AbstractQueuedSynchronizer这个类很重要(在本文中,凯哥就用AQS来代替这个类)。我们先来了解这个类。对这个类了解之后,学习后面的会更容易了。
本篇是《凯哥(凯哥Java:kagejava)并发编程学习》系列之《Lock系列》教程的第一篇:《Java并发包下锁学习第二篇:队列同步器》。
本文主要内容:同步器介绍;同步器和锁的关系;AQS对象构成。
一:队列同步器
AQS是创建锁或者是同步组件的基础框架,其内部维护了一个FIFO队列来维护线程对资源获取的顺序。
定义了若干同步状态获取和释放的方法来供自定义组件使用。如果获取状态(getStatus())、设置状态(setStatus())以及使用CAS设置当前线程状态来确保原子性的。这种设计思想是基于模板方法模式来设计的。使用者(或子类)需要继承同步器并重写方法。
因为同步器支持独占式获取当前线程状态,也支持共享式的获取这个同步状态,所以这样就可以实现不同类型的组件了。如以独占式获取锁的ReentrantLock和以共享式获取的ReentrantReadWriteLock。需要说明的是:在一个同步组件中只能以一种方式获取锁。要么是独占式要么是共享式。
同步器主要是以继承关系,子类实现父类抽象方法来管理自己类中线程状态的。从源码(后面学习中,我们将查看源码)中我们可以看出,推荐子类常常被定义为自定义组件的静态内部类来实现的。
二:同步器和锁之间的关系
同步器是锁(或者是其他同步组件)实现的关键;
锁和同步器定义所面向的对象不同
可以理解为锁是面向开发者(程序员)也即是锁的使用者而言的。锁定义了开发者在调用时候锁的交互接口(如独享方式的锁顶级接口lock),隐藏了锁具体实现的细节。如我们在使用Lock的时候,只需要lock.lock()获取锁,然后使用lock.unlock()释放锁就可以了。具体怎么获取锁,怎么释放锁的操作在内部实现的。使用者不用关心具体实现的细节。
同步器是面向锁的实现类的。如Lock接口的实现类ReentrantLock其内部Sync内部类就是同步器的实现类。同步器简化了锁的实现方式。如对同步状态管理、多个线程排队管理以及线程之间等待与唤醒等这些底层的操作。
可以说,锁和同步器很好的隔离了使用者和实现者所关注的领域。使用者只关心怎么获取/释放锁;实现者关心同步状态、排队等操作的实现。
三:AQS对象构成
为什么会写AQS的构成呢?我们想要彻底的了解独占式锁和共享锁离不开这个对象。所以咱们先来把这个对象搞清楚,然后再学习后面的就方便了。
内部类:Node
在上文中,我们说到,AQS内部是维护了一个FIFO的队列来保证获取锁的线程排队的。这个对象就是Node。在下一篇文章中,凯哥将带着大家一起解读源码,从源码中详细讲解Node内部类及链表是具体怎么工作的,怎么来维护队列实现FIFO的。欢迎继续学习下一篇文章
内部类:CoditionObject
操作线程之间的等待/通知模式的类。其功能和Object的wait()、wait(long time) 、notify()及notifyAll()这些方法类似。但又有不同。在后面文章中,凯哥也会讲解的。
常用的API方法
常用的方法。如独占式获取锁、获取同步状态、独占式释放锁;共享式模式下怎么获取锁、怎么获取同步状态及怎么释放锁;怎么阻塞线程及怎么唤醒线程。这些常用的方法。凯哥在后文中也会详细介绍的。
在接下来的几篇文章中,凯哥将带着大家一起撸码AQS的源码一点一点分析。搞懂锁(或其他同步组件)的基础框架-同步器。欢迎大家接着学习后面文章。
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
程序员的进阶课-架构师之路 - 数组
从这一节开始,我们就要正式进去数据结构的世界了,那么第一个是什么呢,就是我们的数组。在我想写数组的时候,我的第一印象是去看它的源码,很可惜,数组的实现太特殊了,找了很久,我没有找到它的源码,带着这样的思考,我就开始了Java中数组的挖掘。Wow,真香!一、Java中数组的介绍 数组是一种最简单的复合数据类型,它是有序数据的集合,数组中的每个元素具有相同的数据类型,可以用一个统一的数组名和不同的下标来唯一确定数组中的元素。根据数组的维度,可以将其分为一维数组、二维数组和多维数组等。一定要注意,数组只能存放同一种数据类型(Object类型数组除外)。二、数组是一个引用类型吗? 先给答案,是的,没有任何疑问。注意,数组也是一种数据类型,它本身是一种引用类型。数组是一种大小固定的数据结构,对线性表的所有操作都可以通过数组来实现。虽然数组一旦创建之后,它的大小就无法改变了,但是当数组不能再存储线性表中的新元素时,我们可以创建一个新的大的数组来替换当前数组。这样就可以使用数组实现动态的数据结构。如何验证? 定义一个数组,发现它拥有Object类的所有方法。 根据这个例子,其实大家已经看出来了,数组...
- 下一篇
4月1日云栖号头条:阿里旗下高德地图宣布推出新能源汽车充电服务解决方案
云栖号:https://yqh.aliyun.com第一手的上云资讯,不同行业精选的上云企业案例库,基于众多成功案例萃取而成的最佳实践,助力您上云决策! 今日最新云头条快讯: 阿里旗下高德地图宣布推出新能源汽车充电服务解决方案 阿里巴巴旗下高德地图宣布推出新能源汽车充电服务解决方案,并正式上线充电地图。通过与充电运营服务商合作,以及与阿里巴巴集团支付生态能力的打通整合,为电动汽车用户提供一站式服务体验。用户在高德地图搜索“充电站”,即可进入充电地图。目前,高德充电地图已接入特来电、星星充电、快电、联行科技、蚂蚁充电等全网核心充电运营服务商的官方充电桩实时信息和交易链路。 工业富联董事长:防疫是一季度的重点,产线已恢复至节前水平 此前,工业富联发布2019年全年财报,业绩交流会上,工业富联董事长李军旗表示,防疫是一季度的重点,一月底国内疫情非常严峻。他表示,公司在2月初用三天实现了口罩自产,目前已经生产口罩2000多万只,已满足公司自身员工需求,并且提供给上下游企业以及重要客户。“一月底国内疫情非常严峻,我们意识到防疫工作任务艰巨,不过两个月下来,复工复产基本恢复到节前正常水平。” 全球...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- MySQL8.0.19开启GTID主从同步CentOS8
- Mario游戏-低调大师作品
- CentOS关闭SELinux安全模块
- CentOS7,CentOS8安装Elasticsearch6.8.6
- CentOS8安装MyCat,轻松搞定数据库的读写分离、垂直分库、水平分库
- Docker安装Oracle12C,快速搭建Oracle学习环境
- Red5直播服务器,属于Java语言的直播服务器
- CentOS8编译安装MySQL8.0.19
- SpringBoot2整合MyBatis,连接MySql数据库做增删改查操作
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池