iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >如何深入理解Java多线程与并发框中的队列同步器AQS
  • 362
分享到

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

2023-06-05 03:06:18 362人浏览 独家记忆
摘要

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

如何深入理解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问题的解答就分享到这里了,希望以上内容可以对大家有一定的帮助,如果你还有很多疑惑没有解开,可以关注编程网精选频道了解更多相关知识。

--结束END--

本文标题: 如何深入理解Java多线程与并发框中的队列同步器AQS

本文链接: https://www.lsjlt.com/news/241079.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作