`

Java并发包下锁学习第二篇Java并发基础框架-队列同步器介绍

阅读更多

Java并发包下锁学习第二篇队列同步器

还记得在第一篇文章中,讲到的locks包下的类结果图吗?如下图:

从图中,我们可以看到AbstractQueuedSynchronizer这个类很重要(在本文中,凯哥就用AQS来代替这个类)。我们先来了解这个类。对这个类了解之后,学习后面的会更容易了。

本篇是《凯哥(凯哥Java:kagejava)并发编程学习》系列之《Lock系列》教程的第一篇:《Java并发包下锁学习第二篇:队列同步器》。

本文主要内容:同步器介绍;同步器和锁的关系;AQS对象构成。

一:队列同步器

AQS是创建锁或者是同步组件的基础框架,其内部维护了一个FIFO队列来维护线程对资源获取的顺序。

定义了若干同步状态获取和释放的方法来供自定义组件使用。如果获取状态(getStatus())、设置状态(setStatus())以及使用CAS设置当前线程状态来确保原子性的。这种设计思想是基于模板方法模式来设计的。使用者(或子类)需要继承同步器并重写方法。

因为同步器支持独占式获取当前线程状态,也支持共享式的获取这个同步状态,所以这样就可以实现不同类型的组件了。如以独占式获取锁的ReentrantLock和以共享式获取的ReentrantReadWriteLock。需要说明的是:在一个同步组件中只能以一种方式获取锁。要么是独占式要么是共享式。

同步器主要是以继承关系,子类实现父类抽象方法来管理自己类中线程状态的。从源码(后面学习中,我们将查看源码)中我们可以看出,推荐子类常常被定义为自定义组件的静态内部类来实现的。

二:同步器和锁之间的关系

同步器是锁(或者是其他同步组件)实现的关键;

锁和同步器定义所面向的对象不同

可以理解为锁是面向开发者(程序员)也即是锁的使用者而言的。锁定义了开发者在调用时候锁的交互接口(如独享方式的锁顶级接口lock),隐藏了锁具体实现的细节。如我们在使用Lock的时候,只需要lock.lock()获取锁,然后使用lock.unlock()释放锁就可以了。具体怎么获取锁,怎么释放锁的操作在内部实现的。使用者不用关心具体实现的细节。

同步器是面向锁的实现类的。如Lock接口的实现类ReentrantLock其内部Sync内部类就是同步器的实现类。同步器简化了锁的实现方式。如对同步状态管理、多个线程排队管理以及线程之间等待与唤醒等这些底层的操作。

可以说,锁和同步器很好的隔离了使用者和实现者所关注的领域。使用者只关心怎么获取/释放锁;实现者关心同步状态、排队等操作的实现。

三:AQS对象构成

为什么会写AQS的构成呢?我们想要彻底的了解独占式锁和共享锁离不开这个对象。所以咱们先来把这个对象搞清楚,然后再学习后面的就方便了。

内部类:Node

在上文中,我们说到,AQS内部是维护了一个FIFO的队列来保证获取锁的线程排队的。这个对象就是Node。在下一篇文章中,凯哥将带着大家一起解读源码,从源码中详细讲解Node内部类及链表是具体怎么工作的,怎么来维护队列实现FIFO的。欢迎继续学习下一篇文章

内部类:CoditionObject

操作线程之间的等待/通知模式的类。其功能和Object的wait()、wait(long time) 、notify()及notifyAll()这些方法类似。但又有不同。在后面文章中,凯哥也会讲解的。

常用的API方法

常用的方法。如独占式获取锁、获取同步状态、独占式释放锁;共享式模式下怎么获取锁、怎么获取同步状态及怎么释放锁;怎么阻塞线程及怎么唤醒线程。这些常用的方法。凯哥在后文中也会详细介绍的。

在接下来的几篇文章中,凯哥将带着大家一起撸码AQS的源码一点一点分析。搞懂锁(或其他同步组件)的基础框架-同步器。欢迎大家接着学习后面文章。

 

0
2
分享到:
评论

相关推荐

    java并发工具包详解

    1. java.util.concurrent - Java 并发工具包 2. 阻塞队列 BlockingQueue 3. 数组阻塞队列 ArrayBlockingQueue 4. 延迟队列 DelayQueue 5. 链阻塞队列 LinkedBlockingQueue 6. 具有优先级的阻塞队列 ...

    java并发工具包 java.util.concurrent中文版用户指南pdf

    1. java.util.concurrent - Java 并发工具包 2. 阻塞队列 BlockingQueue 3. 数组阻塞队列 ArrayBlockingQueue 4. 延迟队列 DelayQueue 5. 链阻塞队列 LinkedBlockingQueue 6. 具有优先级的阻塞队列 ...

    Java并发编程实战

    第二部分 结构化并发应用程序 第6章 任务执行 6.1 在线程中执行任务 6.1.1 串行地执行任务 6.1.2 显式地为任务创建线程 6.1.3 无限制创建线程的不足 6.2 Executor框架 6.2.1 示例:基于Executor的Web服务器 ...

    Java并发工具包java.util.concurrent用户指南中英文对照阅读版.pdf

    java.util.concurrent - Java 并发工具包 2. 阻塞队列 BlockingQueue 3. 数组阻塞队列 ArrayBlockingQueue 4. 延迟队列 DelayQueue 5. 链阻塞队列 LinkedBlockingQueue 6. 具有优先级的阻塞队列 ...

    Java 并发编程实战

    第二部分 结构化并发应用程序 第6章 任务执行 6.1 在线程中执行任务 6.1.1 串行地执行任务 6.1.2 显式地为任务创建线程 6.1.3 无限制创建线程的不足 6.2 Executor框架 6.2.1 示例:基于Executor的Web服务器 ...

    Java 7并发编程实战手册

    第2章 线程同步基础 41 2.1 简介 41 2.2 使用synchronized实现同步方法 42 2.3 使用非依赖属性实现同步 47 2.4 在同步代码中使用条件 53 2.5 使用锁实现同步 57 2.6 使用读写锁实现同步数据访问...

    Java并发工具包java.util.concurrent用户指南中英文对照阅读版

    1. java.util.concurrent - Java 并发工具包 2. 阻塞队列 BlockingQueue 3. 数组阻塞队列 ArrayBlockingQueue 4. 延迟队列 DelayQueue 5. 链阻塞队列 LinkedBlockingQueue 6. 具有优先级的阻塞队列 ...

    Java并发编程(学习笔记).xmind

    Java并发编程 背景介绍 并发历史 必要性 进程 资源分配的最小单位 线程 CPU调度的最小单位 线程的优势 (1)如果设计正确,多线程程序可以通过提高处理器资源的利用率来提升系统吞吐率 ...

    java并发编程:juc、aqs

    AQS 是 JUC 中的核心组件,它提供了一个框架,让开发者能够轻松地构建自定义的同步器。通过继承 AQS,可以实现不同的同步机制,如独占锁、共享锁等。 高效的等待队列: AQS 内部维护了一个等待队列,用于管理等待锁...

    Java多线程编程总结

    Java 线程系列博文总结word化,编目如下,欢迎互相学习交流: Java线程:概念与原理 Java线程:创建与启动 Java线程:线程栈模型与线程的变量 Java线程:线程状态的转换 Java线程:线程的同步与锁 Java线程:...

    java开源包4

    一个Java的类库,用于异步输出记录的简单小框架用于高并发下数据输出使用。 Java转C++代码工具 J2C J2C 将 Java 代码转成 C++ 代码,这是源码级别的转换,输出的 C++ 代码是有效的代码。 OSGi 分布式通讯组件 R-...

    java多线程编程总结

    Java线程:新特征-锁(下) Java线程:新特征-信号量 Java线程:新特征-阻塞队列 Java线程:新特征-阻塞栈 Java线程:新特征-条件变量 Java线程:新特征-原子量 Java线程:新特征-障碍器 Java线程:大总结

    java开源包8

    一个Java的类库,用于异步输出记录的简单小框架用于高并发下数据输出使用。 Java转C++代码工具 J2C J2C 将 Java 代码转成 C++ 代码,这是源码级别的转换,输出的 C++ 代码是有效的代码。 OSGi 分布式通讯组件 R-...

    java开源包10

    一个Java的类库,用于异步输出记录的简单小框架用于高并发下数据输出使用。 Java转C++代码工具 J2C J2C 将 Java 代码转成 C++ 代码,这是源码级别的转换,输出的 C++ 代码是有效的代码。 OSGi 分布式通讯组件 R-...

    java开源包1

    一个Java的类库,用于异步输出记录的简单小框架用于高并发下数据输出使用。 Java转C++代码工具 J2C J2C 将 Java 代码转成 C++ 代码,这是源码级别的转换,输出的 C++ 代码是有效的代码。 OSGi 分布式通讯组件 R-...

    java开源包11

    一个Java的类库,用于异步输出记录的简单小框架用于高并发下数据输出使用。 Java转C++代码工具 J2C J2C 将 Java 代码转成 C++ 代码,这是源码级别的转换,输出的 C++ 代码是有效的代码。 OSGi 分布式通讯组件 R-...

    java开源包6

    一个Java的类库,用于异步输出记录的简单小框架用于高并发下数据输出使用。 Java转C++代码工具 J2C J2C 将 Java 代码转成 C++ 代码,这是源码级别的转换,输出的 C++ 代码是有效的代码。 OSGi 分布式通讯组件 R-...

    java开源包101

    一个Java的类库,用于异步输出记录的简单小框架用于高并发下数据输出使用。 Java转C++代码工具 J2C J2C 将 Java 代码转成 C++ 代码,这是源码级别的转换,输出的 C++ 代码是有效的代码。 OSGi 分布式通讯组件 R-...

Global site tag (gtag.js) - Google Analytics