加入收藏 | 设为首页 | 会员中心 | 我要投稿 汽车网 (https://www.0577qiche.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 教程 > 正文

怎样深入理解Java多线程与并发框中的队列同步器AQS

发布时间:2023-04-25 12:38:51 所属栏目:教程 来源:
导读:如何深入理解Java多线程与并发框中的队列同步器AQS,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。

一、 AbstractOwnableSynchronizer 抽
如何深入理解Java多线程与并发框中的队列同步器AQS,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。

一、 AbstractOwnableSynchronizer 抽象的、可拥有的同步器

源码分析:

package java.util.concurrent.locks;
/**
 * 可由线程独占的同步器。
 * 该类为创建锁和相关的同步器提供了基础,可能需要拥有所有权的概念。
 * AbstractOwnableSynchronizer 类本身不管理或使用此信息。
 * 但是,子类和工具可以使用适当维护的值来帮助控制和监视访问并提供诊断。
 *
 * @since 1.6
 * @author Doug Lea
 */
public abstract class AbstractOwnableSynchronizer
    implements java.io.Serializable {
    /** 即使所有的字段都是短暂的(被禁止序列化的),也要使用 序列ID。*/
    private static final long serialVersionUID = 3737899427754241961L;
    /**
     * 供子类使用的空的构造方法。
     */
    protected AbstractOwnableSynchronizer() { }
    /**
     * 独占模式同步下的当前(线程)拥有者。(也就是当前独占锁的线程)
     */
    private transient Thread exclusiveOwnerThread;
    /**
     * 设置 当前拥有独占访问的 线程。
     * 空参数指示没有线程拥有访问权限。
     * 此方法不另外施加任何同步化易失性 volatile 字段访问。
     * @param thread 所有者的线程(拥有当前独占访问权的线程)
     */
    protected final void setExclusiveOwnerThread(Thread thread) {
        exclusiveOwnerThread = thread;
    }
    /**
     * 返回 setExclusiveOwnableThread(Thread thread) 方法最后设置的线程,
     * 如果从未设置,则返回 null。
     * 此方法不另外施加任何同步化易失性 volatile 字段访问。
     * @return 所有者的线程(拥有当前独占访问权的线程)
     */
    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)

1. 源码分析:

/**
 * 返回同步状态的当前值。
 * 此操作具有易失性 volatile 读取的内存语义。
 * @return 当前 state 的值
 */
protected final int getState() {    return state;
}
// ------------------- 华丽的分割线 -------------------
/**
 * 设置同步状态 state 的值。
 *  此操作具有易失性 volatile 写的内存语义。
 * @param newState 状态 state 的新值
 */
protected final void setState(int newState) {
    state = newState;
}
// ------------------- 华丽的分割线 -------------------
/**
 * 如果当前状态值等于预期值,则以原子方式将同步状态设置为给定的更新值。
 * 此操作具有易失性 volatile 读取和写入的内存语义。
 *
 * @param expect 期望的值
 * @param update 新值
 * @return 如果成功则为 true 。 错误返回表示实际值不等于预期值的指示。
 */
protected final Boolean compareAndSetState(int expect, int update) {
    // See below for intrinsics setup to support this    return unsafe.compareAndSwapint(this, stateOffset, expect, update);
}

(编辑:汽车网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章