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的源码一点一点分析。搞懂锁(或其他同步组件)的基础框架-同步器。欢迎大家接着学习后面文章。
相关推荐
本文深入探讨了Java并发编程的关键组件——抽象队列同步器(AQS)及其在ReentrantLock的应用。AQS是处理线程同步问题的高效工具,是Java并发编程中的核心。文章首先简要介绍了并发编程领域的先驱Doug Lea。重点在于...
- **java.util.concurrent** 包:提供了各种并发工具类,如Semaphore(信号量)、CyclicBarrier(循环屏障)、CountDownLatch(倒计时器)和ExecutorService(线程池)等。 - **Future和Callable**:Future接口...
1. java.util.concurrent - Java 并发工具包 2. 阻塞队列 BlockingQueue 3. 数组阻塞队列 ArrayBlockingQueue 4. 延迟队列 DelayQueue 5. 链阻塞队列 LinkedBlockingQueue 6. 具有优先级的阻塞队列 ...
1. java.util.concurrent - Java 并发工具包 2. 阻塞队列 BlockingQueue 3. 数组阻塞队列 ArrayBlockingQueue 4. 延迟队列 DelayQueue 5. 链阻塞队列 LinkedBlockingQueue 6. 具有优先级的阻塞队列 ...
Java并发编程之同步器代码示例 ...Java并发编程之同步器代码示例展示了Java中的同步器机制,包括CountDownLatch、Semaphore、Barrier和Exchanger队列同步器等,帮助开发者更好地理解和使用Java中的并发编程技术。
#### 二、Java并发核心概念 在深入讨论具体技术细节之前,我们先了解一些关键的Java并发概念: 1. **Java Memory Model (JMM)**: - **定义**: 在Java SE 5 (JSR133)中引入的Java Memory Model (JMM)旨在确保编写...
Java并发包(java.util.concurrent)也提供了丰富的并发工具,如线程安全集合(如ConcurrentHashMap)、阻塞队列(如ArrayBlockingQueue)、信号量(Semaphore)、并发集合(如CopyOnWriteArrayList)和各种执行器...
Java提供了丰富的并发框架来简化并发编程,例如AbstractQueuedSynchronizer(AQS)是一个用来构建锁和其他同步类的基础框架。java.util.concurrent包中提供了诸如CopyOnWriteArrayList、ConcurrentHashMap等线程安全...
Java平台提供了丰富的并发工具和API,如线程、锁、同步机制、并发集合以及执行器服务等,这些工具和API都在本书中有详尽的介绍。 1. **线程基础**:Java中的线程是并发执行的基本单位。文档会讲解如何创建和管理...
java.util.concurrent - Java 并发工具包 2. 阻塞队列 BlockingQueue 3. 数组阻塞队列 ArrayBlockingQueue 4. 延迟队列 DelayQueue 5. 链阻塞队列 LinkedBlockingQueue 6. 具有优先级的阻塞队列 ...
《Java 并发编程实战》是一本针对Java程序员深入学习并发编程的重要著作。这本书涵盖了从基础知识到高级技术的全面内容,旨在帮助读者理解和掌握多线程环境下的编程实践。书中结合了理论与实际示例,提供了丰富的...
Java提供的并发工具,如线程、同步机制、并发集合以及Executor框架,为开发高效、可靠的并发应用程序提供了强大的支持。以下是一些关键知识点: 1. **线程与进程**:线程是操作系统分配CPU时间的基本单位,而进程则...
"Java并发编程解析 | 解析AQS基础同步器的设计与实现" 在Java领域中,解决并发编程问题的关键是解决同步和互斥的问题。同步是指线程之间的通信和协作,互斥是指同一时刻只能允许一个线程访问共享资源。Java领域中有...
2. **ListenerExamples.java**:此文件可能涉及到事件驱动编程和监听器模式,这是GUI编程中常见的并发问题。在Java中,通常使用`EventListener`接口来处理事件,多个线程可能同时响应事件,这就需要我们理解如何正确...
阻塞队列是线程间的另一种通信方式,如`ArrayBlockingQueue`、`LinkedBlockingQueue`等,它们在`java.util.concurrent`包下。阻塞队列在生产者消费者模型中广泛应用,当队列满时,生产者会被阻塞;当队列空时,消费...
Java提供了两种基本的锁:synchronized关键字和java.util.concurrent.locks包下的Lock接口。synchronized提供了一种内置的、不可中断的锁机制,而Lock接口提供了更细粒度的控制,如可重入、公平性和非阻塞尝试获取锁...
第二部分 结构化并发应用程序 第6章 任务执行 6.1 在线程中执行任务 6.1.1 串行地执行任务 6.1.2 显式地为任务创建线程 6.1.3 无限制创建线程的不足 6.2 Executor框架 6.2.1 示例:基于Executor的Web服务器 ...
本文将基于JDK源码解析Java领域中的并发锁,探讨AQS基础同步器、LockSupport、Condition接口、Lock接口、ReadWriteLock接口以及自定义API操作的设计与实现。 一、AQS(AbstractQueuedSynchronizer)基础同步器的...
4. **并发工具类**:`java.util.concurrent`包提供了许多高级并发工具,如`ExecutorService`和`Future`用于管理线程池,`Semaphore`用于信号量控制,`CountDownLatch`和`CyclicBarrier`用于协调线程的同步,以及`...