2024年Java最新AbstractQueuedSynchronizer源码解析(下),系统学Java从零开始

本文详细解析了JavaReentrantLock的acquire和release方法,以及Condition接口的使用,涉及算法、数据结构、数据库、并发编程和JVM等知识点,展示了如何在多线程环境下管理和控制锁的获取、共享和释放,以及条件队列在协作中的作用。
摘要由CSDN通过智能技术生成

文末

我将这三次阿里面试的题目全部分专题整理出来,并附带上详细的答案解析,生成了一份PDF文档

  • 第一个要分享给大家的就是算法和数据结构

网易严选Java开发三面面经:HashMap+JVM+索引+消息队列

  • 第二个就是数据库的高频知识点与性能优化

网易严选Java开发三面面经:HashMap+JVM+索引+消息队列

  • 第三个则是并发编程(72个知识点学习)

网易严选Java开发三面面经:HashMap+JVM+索引+消息队列

  • 最后一个是各大JAVA架构专题的面试点+解析+我的一些学习的书籍资料

网易严选Java开发三面面经:HashMap+JVM+索引+消息队列

还有更多的Redis、MySQL、JVM、Kafka、微服务、Spring全家桶等学习笔记这里就不一一列举出来

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

需要这份系统化的资料的朋友,可以点击这里获取

if (ws > 0) {

// 找到前一个状态不是取消的节点,因为把当前 node 挂在有效节点的身上

// 因为节点的状态是取消的话,是无效的,是不能作为 node 的前置节点的,所以必须找到 node 的有效节点才行

do {

node.prev = pred = pred.prev;

} while (pred.waitStatus > 0);

pred.next = node;

// 否则直接把节点状态设置为 signal

} else {

compareAndSetWaitStatus(pred, ws, Node.SIGNAL);

}

return false;

}

acquire 整个过程非常长,代码也非常多,但注释很清楚,可以一行一行仔细看看代码。

1.1.5 总结

acquire 方法大致分为三步:

  1. 使用 tryAcquire 方法尝试获得锁,获得锁直接返回,获取不到锁的走 2;

  2. 把当前线程组装成节点(Node),追加到同步队列的尾部(addWaiter);

  3. 自旋,使同步队列中当前节点的前置节点状态为 signal 后,然后阻塞自己。

1.2 acquireShared 获取共享锁


acquireShared 整体流程和 acquire 相同,代码也很相似,重复的源码就不贴了,我们就贴出来不一样的代码来,也方便大家进行比较:

  1. 第一处尝试获得锁的地方,有所不同,排它锁使用的是 tryAcquire 方法,共享锁使用的是 tryAcquireShared 方法,如下图:

在这里插入图片描述

  1. 第二处不同,在于节点获得排它锁时,仅仅把自己设置为同步队列的头节点即可(setHead 方法),但如果是共享锁的话,还会去唤醒自己的后续节点,一起来获得该锁(setHeadAndPropagate 方法),不同之处如下(左边排它锁,右边共享锁):

在这里插入图片描述

1.2.1 setHeadAndPropagate

这个方法主要做了两件事:

  1. 把当前节点设置成头节点

  2. 看看后续节点有无正在等待,并且也是共享模式的,有的话唤醒这些节点

private void setHeadAndPropagate(Node node, int propagate) {

Node h = head;

// 当前节点设置成头节点

setHead(node);

// propagate > 0 表示已经有节点获得共享锁了

if (propagate > 0 || h == null || h.waitStatus < 0 ||

(h = head) ==

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值