- Java锁的逻辑(结合对象头和ObjectMonitor)
- 还在用饼状图?来瞧瞧这些炫酷的百分比可视化新图形(附代码实现)⛵
- 自动注册实体类到EntityFrameworkCore上下文,并适配ABP及ABPVNext
- 基于Sklearn机器学习代码实战
juc包下的一堆并发工具类是我们日常开发特别是面试中常被拿来问的八股文之一,为了工作也好,为了面试也罢,今天开始想尝试着把这些给大伙描述明白,所以开始写下这篇博文,如果后续要涉及每个常用类的源码的话可能会是一个系列,计划从比较底层的AQS聊起,然后结合ReentrantLock的源码来聊AQS独占锁的具体实现,以及加锁和释放锁的过程;然后再聊聊JUC包下其他类如CountDownLatch、CyclicBarrier、Phaser、ReadWriteLock、Semaphore、Exchanger以及LockSupport的使用和原理,有时间的话再结合CountDownLatch的源码来聊AQS共享锁的具体实现,接下来话不多说开始踏上揭秘AQS之旅 。
注:由于后续会介绍AQS的源码以及子类实现,所以这里只是大白话般的描述了一下AQS的原理,即两个关键:一个state一个双向队列,其实要展开还有许多细节要聊,考虑到这些细节后续源码里会有体现这里就不再表述了 。
private volatile int state;
1、state是AQS提供的供子类拓展的一个同步状态,子类可以维护state的不同状态来实现不同效果的锁实现,如ReentrantLock就是通过维护state是否为0或1来表示锁的加解操作; 。
2、用volatile修饰主要是为了在并发环境下线程可见 。
static final class Node {
/** 表示当前节点正处于共享模式 */
static final Node SHARED = new Node();
/** 表示当前节点正处于独占模式 */
static final Node EXCLUSIVE = null;
/** waitStatus对应的值,表示线程已取消 */
static final int CANCELLED = 1;
/** waitStatus对应的值,指示后续线程需要取消标记*/
static final int SIGNAL = -1;
/** waitStatus对应的值,指示线程正在等待condition唤醒*/
static final int CONDITION = -2;
/**
* waitStatus value to indicate the next acquireShared should
* unconditionally propagate
*/
static final int PROPAGATE = -3;
/**
* 等待状态,枚举值有1,0,-1,-2,-3分别对应上面的几个变量值,0表示以上状态都不是
*/
volatile int waitStatus;
/**
* 当前Node的前置节点
*/
volatile Node prev;
/**
* 当前Node的后继节点
*/
volatile Node next;
/**
* 与当前Node绑定的被阻塞的线程
*/
volatile Thread thread;
/**
* 下一个等待节点,Condition状态下要用到
*/
Node nextWaiter;
/**
* 如果节点在共享模式下等待,则返回true。
*/
final boolean isShared() {
return nextWaiter == SHARED;
}
/**
* 获取当前队列的前置节点
*
* @return the predecessor of this node
*/
final Node predecessor() throws NullPointerException {
Node p = prev;
if (p == null)
throw new NullPointerException();
else
return p;
}
Node() { // Used to establish initial head or SHARED marker
}
Node(Thread thread, Node mode) { // Used by addWaiter
this.nextWaiter = mode;
this.thread = thread;
}
Node(Thread thread, int waitStatus) { // Used by Condition
this.waitStatus = waitStatus;
this.thread = thread;
}
}
tryAcquire(int) 尝试获取锁,获取成功返回true,失败返回false 。
tryRelease(int) 尝试释放锁,释放成功返回true,失败返回false 。
tryAcquireshared(int) 。
尝试获取锁,负数表示失败; 0表示功,但没有剩余可用资源:正数表示成功,且有剩余资源.
tryReleaseshared(int) 。
尝试释放锁,成功返回true,失败返回false 。
上面简单介绍了一下AQS的原理以及源码的部分注释,接下来我会写一篇ReentrantLock源码解读的相关文章,来体验下AQS的实际用处 。
最后此篇关于聊聊JUC包下的底层支撑类-AbstractQueuedSynchronizer(AQS)的文章就讲到这里了,如果你想了解更多关于聊聊JUC包下的底层支撑类-AbstractQueuedSynchronizer(AQS)的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
聊聊JUC包下的底层支撑类-AbstractQueuedSynchronizer(AQS) juc包下的一堆并发工具类是我们日常开发特别是面试中常被拿来问的八股文之一,为了工作也好,为了面试也
在await AQS的方法(AbstractQueuedSynchronizer):我想知道 while (!isOnSyncQueue(node)) { 中 while 的含义 我觉得如果这个节点正
我正在查看 java.uti.concurrent.locks.AbstractQueuedSynchronizer 的源代码,acquire() 方法看起来像这样 - public final v
关闭。这个问题需要多问focused 。目前不接受答案。 想要改进此问题吗?更新问题,使其仅关注一个问题 editing this post . 已关闭 9 年前。 Improve this ques
我正在实现一个自定义的 FutureTask (未扩展)以在线程池等中使用。我需要特殊功能,并且无法直接扩展 FutureTask 的方法。为了帮助我做到这一点,我查看了默认实现。如果您无法访问代码,
我编写了一个使用 AbstractQueuedSynchronizer 的简单类。我写了一个代表“门”的类,如果打开则可以通过,如果关闭则阻塞。这是代码: public class GateBlock
大佬们,谁能给个LockSupport & AbstractQueuedSynchronizer的简单实用例子? javadocs 中给出的示例很紧张。 我理解 Semaphore 许可的使用。 感谢
我知道一些关于 AbstractQueuedSynchronizer 的细节。它是一个用于创建状态依赖类或同步器的框架。但是我没有得到在 ThreadPoolExecutor 的 Worker 中扩展
我试图从较高的层次理解 java 的并发 API 是如何使用 AbstractQueuedSynchronizer 作为构建 block 构建的。我在这个类中没有看到任何synchronized、wa
我无法弄清楚为什么几个“ajp-nio-8009-exec-XX”类型的线程被阻止。典型的线程转储堆栈跟踪如下所示: at sun.misc.Unsafe.park(Native Method)
我是一名优秀的程序员,十分优秀!