`

Java.util.concurrent 源码解读(一)

阅读更多

前面已经可以了解到AQS的设计,接下看一下具体的使用和实现:

1、java.util.concurrent 的结构:

曾经有一张图可以十分清楚地展示java.util.concurrent的结构,我也借来用一下,有助于理清楚整个大的结构,接下去主要是对各个部分的具体实现进行分析,首先还是从锁说起;

 


 

2、lock部分实现的类图:


上图是整个AQS的类图,红色框类表示JDK文档里面自带的一个简单使用ASQ的互斥锁的实现;接下去我们主要从AQS本身和这个简单的实现来解读源码;当然这里完全可以换为ReentrantLock等我们常使用的锁;只不过他们们本身有更加复杂的策略,但是作为AQS的使用者来说,完全是一样的;

 

2.1、父类AbstractOwnableSynchronizer:从类图中可以发现这个抽象类只有一个Thread类型的成员变量exclusiveOwnerThread;用来存放独占模式时当前的线程;

 

2.2、Node类:这个类定义了一系列的静态的常量,类图的中的注释可以看到主要的一部分,如CANCELLED、SIGNAL等,这4个int常量加上0用来作为waitStatus可能的值,用来表示当前线程的状态;另外还有两个Node类型的常量SHARED、EXCLUSIVE,SHARED赋值为了一个空的Node对象,EXCLUSIVE=null;这个两个常量用来作为nextWaiter对象可能的取值,表示下一个在条件队列上的node,因为条件队列只有在互斥模式下有意义,所以如果是共享模式等于一个常量,即是SHARED,而互斥模式下新增第一个节点的时候,由于还没有其他线程在该条件上阻塞,所以初始化为两一个常量EXCLUSIVE,也就是null;

      另外剩下就是一个指向对应线程的Thread的对象,和指向前一个和后一个节点的Node类型的对象;

      Node类有两个重要的方法,一个是isShared(),很明显是判断当前线程的同步模式,根据前面对nextWaiter变量的说明,很容易想到实现只有一行代码:

 

final boolean isShared() {
            return nextWaiter == SHARED;
        }

 两外一个是predecessor(),返回当前节点的前一个节点,实现也很简单:返回prev的值,只是增加为null的判断;

 

final Node predecessor() throws NullPointerException {
            Node p = prev;
            if (p == null)
                throw new NullPointerException();
            else
                return p;
        }

你一定会很奇怪:为什么要单独提供predecessor,而没有提供对应的获取next的方法呢?我想主要有两个原因:1、在论文里面也提到,next的路径只是作为一个优化路径。如果一个节点的next判断是null,是不能相信的还必须通过从尾部通过prev域反向查找(因为不能实现双向链表的无锁的原子插入)。2、在后面的使用场景中可以发现,其实是把跑出异常作为了结束循环的条件,统一到这里来可以使使用的代码简单整洁。

 整个Node类是static、final的,并且是AQS的内部类;

 

2.3、AQS类,这个类是整个lock框架的核心,代码量也比较大,将在下一节详细的介绍;

 

未完待续。。。

 

 

 

本站支持 pay for your wishes

  • 大小: 399.6 KB
  • 大小: 48.6 KB
0
0
分享到:
评论

相关推荐

    业级超高并发与高可用架构实现 JUC高并发编程 Java.Util.Concurrent源码+原理解析

    Java.Util.Concurrent是在并发编程中很常用的实用工具类。此包包括了几个小的、已标准化的可扩展框架,以及一些提供有用功能的类,没有这些类,这些功能会很难实现或实现起来冗长乏味。课程从技术原理和细节上,进行...

    Java rt.jar 源码分析

    4. 多线程:`java.lang.Thread`和`java.util.concurrent`包下的类提供了多线程编程的支持。通过源码,我们可以学习如何实现线程安全的数据结构,以及如何使用线程池等高级特性。 5. 网络编程:`java.net`包提供了...

    java源码文档src

    `java.text`和`java.util.Locale`包提供了国际化和本地化的支持,源码解读能帮助开发者为不同地区和语言的用户提供定制服务。 总之,Java源码文档src是Java开发者不可或缺的学习资源,它揭示了Java平台的内在工作...

    Java SE 源码 Java SE 源码

    源码解读能揭示反射在动态类型语言特性中的作用。 7. **集合框架**:Java集合框架包括数组、列表、队列、映射等数据结构,如`ArrayList`、`HashMap`等。源码揭示了这些数据结构的实现细节,对于优化和定制自己的...

    java源码解读-java-src:java源码解读

    Java源码解读是Java开发人员深入理解平台工作原理和编程模型的重要途径。在这个"java-src:java源码解读"项目中,我们可以探索Java的核心库,包括JVM(Java虚拟机)、集合框架、并发机制、I/O流、网络编程等多个关键...

    JDK源码选读

    源码解读有助于理解TCP和UDP连接的建立、数据传输过程。 7. **反射API**:`java.lang.reflect`包包含用于运行时动态访问和修改类的API。通过源码学习,我们可以掌握如何通过反射创建对象、调用方法、访问字段,以及...

    Java并发编程实践源码

    《Java并发编程实践》是一本深入探讨Java多线程与并发编程的经典著作,其源码提供了丰富的示例,帮助读者理解和应用并发编程的核心概念。在这些文件中,我们可以看到多种并发设计模式和策略的实际运用,下面将逐一...

    Java互联网实时聊天系统源码.zip

    Java并发包(java.util.concurrent)提供了各种工具类,如ConcurrentHashMap、BlockingQueue等,用于高效地处理并发数据。例如,消息队列可以用来缓存待发送的消息,确保消息的有序性和一致性。 然后,消息推送是...

    Java装逼指南.pdf

    java.util.concurrent - **LockSupport**、**AQS**等同步工具类,提供了高级的锁和同步功能。 - **ReentrantLock**、**ReentrantReadWriteLock**等锁机制,支持公平与非公平锁策略。 - **ThreadPoolExecutor**、**...

    java8看不到源码-cron-expression:Javacron表达式库

    它提供了用于与java.util.concurrent集成的代码,尽管使用它是可选的,并且使用自己的代码可能更直接。 如果您已经在使用(或不介意使用)Java8,想要处理cron表达式,并且不想要像 . 动机 支持 POSIX cron 语法 ...

    javajdk源码学习-javaSource:JDK源码学习

    5. **I/O流**:`java.io`和`java.nio`包提供了输入输出功能,源码解读有助于理解缓冲区操作、字符编码转换以及不同类型的流(如字节流、字符流)的工作方式。 6. **反射与动态代理**:`java.lang.reflect`包中的类...

    javajdk源码-java-source:jdk源代码

    源码解读可以帮助我们优化代码性能,理解不同集合类型的内部结构和操作效率。 9. **IO与NIO**:`java.io`包提供了传统的输入输出流,而`java.nio`包引入了非阻塞I/O,提供了更高效的I/O操作。通过源码,我们可以...

    Android源码——倒计时实现源码_new_33.7z

    这是一个抽象类,位于`java.util.concurrent`包下,它允许我们定义一个在未来特定时间点结束的倒计时,并在每个时间间隔执行一些操作。CountDownTimer有两个必须重写的回调方法: 1. `onTick(long ...

    5_Executors源码阅读1

    在Java多线程编程中,`java.util.concurrent.Executors`类扮演着至关重要的角色。它提供了一系列静态工厂方法,用于创建和管理线程池,以及与之相关的ExecutorService、ScheduledExecutorService、ThreadFactory和...

    架设教程文件,架设搭建教程,Java

    理解Java的Thread类和并发包(java.util.concurrent)是保证服务器高效运行的关键。 7. **服务器配置**:冒险岛079的架设可能涉及到一系列的配置文件,如服务器端口设置、游戏参数调整等。你需要学会如何解读和修改...

    带你看看Java-AQS同步器 源码解读四 条件队列Condition上

    在Java中,`java.util.concurrent.locks.Condition`接口是条件队列的抽象,它允许线程在等待特定条件时挂起,并在条件满足时被唤醒。与传统的`wait()`和`notify()`方法相比,`Condition`提供了更细粒度的控制,更...

    Andorid jar库源码Bolts原理解析

    而`BackgroundThread`则根据当前是否为Android运行环境来决定使用`java.util.concurrent.Executors`还是`AndroidExecutors`创建线程池,确保资源的有效利用。 引入Bolts库到Android项目中,只需要在Gradle依赖中...

    SimpleThreadDecryptor:一个简单的Java程序,用于使用密码解密进行并行编程

    "用于使用加密和解密来进行并行编程" 表明它不仅涉及解密,还可能包含加密功能,同时强调了并行处理的能力,这可能是通过Java的多线程机制实现的,如`java.util.concurrent`包中的工具类。 **标签解读:** "Java...

    Software-Architecture-Project:分析hadoop的源代码

    2. 并发与网络编程:Java的并发库和Socket通信API在Hadoop中扮演重要角色,如`java.util.concurrent`包中的线程池和`java.net.Socket`类,实现了任务调度和节点间通信。 3. 序列化:Hadoop利用Java的序列化机制(如...

Global site tag (gtag.js) - Google Analytics