先自我介绍一下,小编浙江大学毕业,去过华为、字节跳动等大厂,目前阿里P7
深知大多数程序员,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年最新Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上Android开发知识点,真正体系化!
由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新
如果你需要这些资料,可以添加V获取:vip204888 (备注Android)
正文
该方法由AQS实现,负责在获取锁失败后调用,将当前请求锁的线程包装成Node并且放到等待队列中
,并返回该Node。
3. acquireQueued(addWaiter(Node.EXCLUSIVE), arg)
该方法由AQS实现。针对上面加入到队列的Node不断尝试两种操作之一:
-
若前驱节点是head节点的时候,尝试获取锁;
-
调用
park
将当前线程挂起,线程阻塞。
4. selfInterrupt
该方法由AQS实现。恢复用户行为。
-
用户在外界调用
t1.interrupt()
进行中断。 -
线程在
parkAndCheckInterrupt
方法被唤醒之后。会调用Thread.interrupted();
判断线程的中断标识,而该方法调用完毕会清除中断标识位。 -
而AQS为了不改变用户标识。再次调用
selfInterrupt
恢复用户行为。
2.2 如何构建等待队列——addWaiter
我们使用ReentrantLock
独占锁时,等待队列是延迟加载
的。也就是说若是线程交替执行,那么借助信号量(状态)
来保证。若是线程并发执行,就需要将阻塞线程放入到队列中。
//注意这个方法可能存在并发问题,mode为null(独占锁)。
private Node addWaiter(Node mode) {
Node node = new Node(