【JUC】AQS的由来及源码分析、Java中断机制

1.我们使用CAS在硬件底层方面实现了原子的修改一个内存的值,但是如何对于对象来进行原子修改呢?  我们来了解下AQS

2.AbstactQueuedSynchronizer 好长的单词。。。

3.成员变量

 

 4.在外面等待的线程是在一个FIFO的队列。head、tail分别是队列的头和尾

 

 5.队列的node结构

 

 6.

 

 7.tryAcquire是一个需要重写的方法 

 

8.acquire方法 final类型不允许重写

if条件判断中首先写判断是否能获得 如果能获得tryacquire为true 那么加个! 就是false 直接返回。

如果tryAcquire不能获得 那么在进行 addWaiter将线程包装为node结点放进队列 然后

 

 9.上面出现的addWaiter的方法,讲线程包装成node结点 放进队列(快速入队)

这里面虽然使用了compareAndSetTail方法是原子的 但是不能保证 下面前指针的next在赋给当前node时 是原子的。

如果别的线程也在进行插入的话 tail尾结点就会变化了 。但是我们这里用的只是前结点而不是尾结点 保证此操作没问题。

 

 

 enq方法 确保node结点入队(完整入队 如果自旋的话 cpu浪费资源)

 

 

10.这里要说明一下FIFO的队列的HEAD结点 头节点不是实际节点 而是一个虚节点。

在acquire方法里面还有个判断条件 acquireQueued方法用来判断是否是HEAD的结点的下一个(因为头节点为虚结点 所以下一个才是真正需要资源的线程)

将p应用方法变为node的前一结点。

如果p为head 则进行下面 返回挂起为false 

 

 

 

 

 

 

 

 

 

Java中断机制

posted @ 2021-03-05 22:33  枫叶像思念  阅读(100)  评论(0编辑  收藏  举报