网站首页 > 技术教程 正文
下面我们从一些源码的角度来看看JUC包中lock锁的经典实现ReentrantLock,并且看看AbstractQueuedSynchronizer(AQS,下面就以该简称叙述了)同步器的底层实现。
本篇内容较多,希望大家耐心看完,比较难,不是很好理解,如有错误的地方,望大家海涵。标题只是为了吸引眼球,但两者确实有着千丝万缕的关系。因为想要搞明白Java的重入锁ReentrantLock,你必须要明白AQS;要想搞明白AQS,ReentrantLock锁的辅助分析又必不可少,所以我就两个一起看了。
Lock和synchronized的区别
在我们之前学习synchronized时,我们也说到,在JDK1.6之前效率是很低的,但是和LOCK相比较,还是有着很大的差距;在1.6之后做了很大的优化和提升(锁优化升级),相比较而言,性能上和LOCK相差无几;
虽然synchronized隐式地帮助我们实现了我们想要的锁的功能(不用我们自己操心如何上锁、解锁),但是缺少了上锁和解锁的可操作性,导致一些问题的不可控,且它为独占式的锁,在真正的高并发场景是满足不了我们的需求的;而Lock支持中断和超时、还支持尝试机制获取锁,提高了可控性和可操作性; 且在JUC包下的有着很多锁的实现,可以在不同的需求场景应用合适的锁。
下面就跟着笔者,打开工具idea/eclipse来进入源码世界吧,具体源码位置如下图:
从类关系UML图大概了解AQS和Lock的关系
从上图中我们可以看到,这里有两个顶级接口,Lock和Condition,上源码
Lock就是锁的顶级父类,定义了几个加锁和释放锁的方法,还有一个就是可以新建条件等待队列的方法newCondition();
Condition按照我的理解它代表某个条件,意思就是如果某个条件还没达成,就会建立一个等待条件达成的等待队列,这个等待队列里放的都是些等待这个条件可行的线程。观其定义的一些方法,就跟我们之前篇幅里讲wait/notify范式类似,其实他们的原理都是相通的。其中的await就相当于wait(),signal()/signalAll()相当于notify()/notifuAll()。我们后面都会去分析的。
再回到上面的UML图,刚刚我们只是简单介绍了下两个顶级父接口,这里我们还有一个抽象类AbstractOwnableSynchronizer,他是我们主角AQS的父类。如下
这个类中只定义了一个属性exclusiveOwnerThread(当前独占模式所有者,本质是一个线程,独占模式什么意思后续会说),其他什么也没有,为什么就这么一个属性要单独搞个父类呢,我们观其父类的子类其实是有两个,还有一个AbstractQueuedLongSynchronizer,其实这个类就是AbstractQueuedSynchronizer的一个补充实现,就是里面的资源state变量,一个是int型,还有一个是long型而已。。。一般情况下,用不到哈~
再继续,我们看我们的主角AbstractQueuedSynchronizer类,观其类名就应该知道,这个类大概就是抽象的同步队列,既然是队列,那意思就是说,我们这个类里面维护了一个队列,学过数据结构的我们都知道,队列的建立一般都需要节点Node,这时我们再看UML图,在我们AQS的内部确实实现了一个Node的类。
这个节点类呢其实就是用来包装线程的,他给出了进入队列线程的一些额外属性,比如当前的状态,它前面的线程节点,后面的线程节点等等。由此我们看出,AQS它就是一个用来管理同步线程队列的一个类。
再继续,我们看到了Lock的一个实现类(另一个主角),重入锁ReentrantLock,观其内部,一共继承AQS实现了三个类,一个Sync,还有两个继承了Sync,分别是NonfairSync(非公平)和FairSync(公平),其实这两个类就是我们之前讲过的公平和非公平锁的体现了。
由于内容和篇幅较长,我们明天会继续讲解这个内容哦!
猜你喜欢
- 2024-10-30 读写锁,你难道不需要了解一下吗?
- 2024-10-30 谷歌云故障14个小时,系“队列突变大量积压”引起
- 2024-10-30 什么是AQS及其原理(aqs作用)
- 2024-10-30 码仔漫画:怎么给女朋友讲明白线程池?
- 2024-10-30 面试官:谈谈这4种磁盘IO调度算法--CFQ、NOOP、Deadline、AS
- 2024-10-30 QT的信号槽机制简介(qt信号槽优缺点)
- 2024-10-30 Java AQS(AbstractQueuedSynchronizer)详解
- 2024-10-30 AQS是什么(AQS是什么药品)
- 2024-10-30 详解磁盘IO调度算法--CFQ、NOOP、Deadline、AS
- 2024-10-30 基于AbstractQueuedSynchronizer的并发类实现
你 发表评论:
欢迎- 最近发表
-
- linux CentOS检查见后门程序的shell
- 网络安全工程师演示:黑客是如何使用Nmap网络扫描工具的?
- Linux中ftp服务修改默认21端口等(linux修改ftp配置文件)
- Linux系统下使用Iptables配置端口转发,运维实战收藏!
- 谈谈TCP和UDP源端口的确定(tcp和udp的端口号相同吗)
- Linux 系统 通过端口号找到对应的服务及相应安装位置
- 快速查找NAS未占用端口!Docker端口秒级排查+可视化占坑双杀技
- 【知识杂谈#2】如何查看Linux的(本地与公网)IP地址与SSH端口号
- 如何在Linux中查询 DNS 记录,这三个命令可谓是最常用、最经典的
- 【Linux系统编程】特殊进程之守护进程
- 标签列表
-
- 下划线是什么 (87)
- 精美网站 (58)
- qq登录界面 (90)
- nginx 命令 (82)
- nginx .http (73)
- nginx lua (70)
- nginx 重定向 (68)
- Nginx超时 (65)
- nginx 监控 (57)
- odbc (59)
- rar密码破解工具 (62)
- annotation (71)
- 红黑树 (57)
- 智力题 (62)
- php空间申请 (61)
- 按键精灵 注册码 (69)
- 软件测试报告 (59)
- ntcreatefile (64)
- 闪动文字 (56)
- guid (66)
- abap (63)
- mpeg 2 (65)
- column (63)
- dreamweaver教程 (57)
- excel行列转换 (56)
本文暂时没有评论,来添加一个吧(●'◡'●)