![](https://img-blog.csdnimg.cn/20201014180756928.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
Java
文章平均质量分 93
奋斗ing中
这个作者很懒,什么都没留下…
展开
-
LockSupport的park和unpark的原理
我们知道各种并发框架如CountDownLatch、CyclicBarrier和Semaphore是基于AQS (AbstractQueuedSynchronizer)框架实现的,AQS框架借助于两个类:Unsafe(提供CAS操作) //JDK9以后引入了VarHandle变量句柄,代替了Unsafe LockSupport(提供park/unpark操作)而LockSupport的park和unpark的实现是依赖于Unsafe类的prak和unpark的。重载方法中可以传入一个blocker对原创 2021-03-15 18:28:53 · 2259 阅读 · 0 评论 -
AQS(AbstractQueuedSynchronizer)中为什么需要一个虚拟 head 节点
为什么在在使用lock方法时候,要创建一个虚拟节点呢?事情要从 Node 类的 waitStatus 变量说起,简称 ws。每个节点都有一个 ws 变量,用于这个节点状态的一些标志。初始状态是 0。如果被取消了,节点就是 1,那么他就会被 AQS 清理。还有一个重要的状态:SIGNAL —— -1,表示:当当前节点释放锁的时候,需要唤醒下一个节点。所有,每个节点在休眠前,都需要将前置节点的 ws 设置成 SIGNAL。否则自己永远无法被唤醒。而为什么需要这么一个 ws 呢?—— 防止重.原创 2021-03-14 12:42:11 · 3244 阅读 · 8 评论 -
UNSAFE和Java 内存布局(深入理解:锁/反射/线程挂起/内存回收等)
最近在翻ReentrantLock源码的时候,看到AQS(AbstractQueuedSynchronizer.java)里面有一段代码 protected final boolean compareAndSetState(int expect, int update) { // See below for intrinsics setup to support this return unsafe.compareAndSwapInt(this, stateOff原创 2021-03-14 11:11:21 · 235 阅读 · 0 评论