如何深入理解Java多线程与并发框中的队列同步器AQS
如何深入理解Java多线程与并发框中的队列同步器AQS,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。
一、 AbstractOwnableSynchronizer 抽象的、可拥有的同步器
源码分析:
package java.util.concurrent.locks;public abstract class AbstractOwnableSynchronizer implements java.io.Serializable { private static final long serialVersionUID = 3737899427754241961L; protected AbstractOwnableSynchronizer() { } private transient Thread exclusiveOwnerThread; protected final void setExclusiveOwnerThread(Thread thread) { exclusiveOwnerThread = thread; } protected final Thread getExclusiveOwnerThread() { return exclusiveOwnerThread; }}
小结: 独占、持有锁的线程成员变量:Thread exclusiveOwnerThread setExclusiveOwnerThread(Thread thread) 设置独占、持有锁的线程成员变量 getExclusiveOwnerThread() 获得独占、持有锁的线程成员变量
二、 AbstractQueuedSynchronizer 抽象、队列同步器 AQS
AbstractQueuedSynchronizer 简介
提供了一个基于 FIFO队列,可以用于构建锁或者其他相关同步装置的基础框架。该 抽象队列同步器(以下简称队列同步器)利用了一个 private volatile int state来表示 同步状态,期望它能够成为实现大部分同步需求的基础。使用的方法是继承,子类通过继承同步器并需要实现它的方法来管理其状态,管理的方式就是通过类似 acquire获取 和 release释放 的方式来 操纵状态。然而 多线程环境中对状态的操纵必须确保原子性,因此子类对于状态的把握,需要使用这个同步器提供的以下三个方法对状态进行操作:
private volatile int state;
java.util.concurrent.locks.AbstractQueuedSynchronizer.getState()
java.util.concurrent.locks.AbstractQueuedSynchronizer.setState(int newState)
java.util.concurrent.locks.AbstractQueuedSynchronizer.compareAndSetState(int expect, int update)
源码分析:
protected final int getState() {return state;}// ------------------- 华丽的分割线 -------------------protected final void setState(int newState) {state = newState;}// ------------------- 华丽的分割线 -------------------protected final Boolean compareAndSetState(int expect, int update) {// See below for intrinsics setup to support thisreturn unsafe.compareAndSwapint(this, stateOffset, expect, update);}
FIFO 队列 (类似双向链表)
同步器的开始提到了其实现依赖于一个 FIFO 队列,那么队列中的 元素节点Node 就是保存着 线程引用 和 线程状态 的 容器,每个线程对同步器的访问,都可以看做是队列中的一个节点Node。Node的主要包含以下成员变量:
static final class Node {static final Node SHARED = new Node();static final Node EXCLUSIVE = null;int waitStatus;volatile Node prev;volatile Node next;volatile Thread thread;volatile Node nextWaiter;final Boolean isShared() {return nextWaiter == SHARED;}}
关于如何深入理解Java多线程与并发框中的队列同步器AQS问题的解答就分享到这里了,希望以上内容可以对大家有一定的帮助,如果你还有很多疑惑没有解开,可以关注编程网行业资讯频道了解更多相关知识。
免责声明:
① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。
② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341