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高并发程序设计》第二版是一本深入探讨Java多线程和并发编程的书籍。这本书涵盖了Java并发编程的核心概念和技术,旨在帮助开发者在实际项目中高效地处理高并发场景。随书附带的代码提供了丰富的示例,以便...
本文深入探讨了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. 具有优先级的阻塞队列 ...
第二部分 结构化并发应用程序 第6章 任务执行 6.1 在线程中执行任务 6.1.1 串行地执行任务 6.1.2 显式地为任务创建线程 6.1.3 无限制创建线程的不足 6.2 Executor框架 6.2.1 示例:基于Executor的Web服务器 ...
Java并发编程之同步器代码示例 ...Java并发编程之同步器代码示例展示了Java中的同步器机制,包括CountDownLatch、Semaphore、Barrier和Exchanger队列同步器等,帮助开发者更好地理解和使用Java中的并发编程技术。
Java平台提供了丰富的并发工具和API,如线程、锁、同步机制、并发集合以及执行器服务等,这些工具和API都在本书中有详尽的介绍。 1. **线程基础**: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.util.concurrent - Java 并发工具包 2. 阻塞队列 BlockingQueue 3. 数组阻塞队列 ArrayBlockingQueue 4. 延迟队列 DelayQueue 5. 链阻塞队列 LinkedBlockingQueue 6. 具有优先级的阻塞队列 ...
《Java 并发编程实战》是一本针对Java程序员深入学习并发编程的重要著作。这本书涵盖了从基础知识到高级技术的全面内容,旨在帮助读者理解和掌握多线程环境下的编程实践。书中结合了理论与实际示例,提供了丰富的...
Java提供的并发工具,如线程、同步机制、并发集合以及Executor框架,为开发高效、可靠的并发应用程序提供了强大的支持。以下是一些关键知识点: 1. **线程与进程**:线程是操作系统分配CPU时间的基本单位,而进程则...
《Java并发编程的艺术》这本书是Java开发者深入理解并发编程的重要参考。...通过学习《Java并发编程的艺术》,开发者可以深入理解Java并发原理,掌握有效的并发编程技巧,从而编写出高效、稳定、可维护的多线程程序。
"Java并发编程解析 | 解析AQS基础同步器的设计与实现" 在Java领域中,解决并发编程问题的关键是解决同步和互斥的问题。同步是指线程之间的通信和协作,互斥是指同一时刻只能允许一个线程访问共享资源。Java领域中有...
2. **ListenerExamples.java**:此文件可能涉及到事件驱动编程和监听器模式,这是GUI编程中常见的并发问题。在Java中,通常使用`EventListener`接口来处理事件,多个线程可能同时响应事件,这就需要我们理解如何正确...
阻塞队列是线程间的另一种通信方式,如`ArrayBlockingQueue`、`LinkedBlockingQueue`等,它们在`java.util.concurrent`包下。阻塞队列在生产者消费者模型中广泛应用,当队列满时,生产者会被阻塞;当队列空时,消费...
Java提供了两种基本的锁:synchronized关键字和java.util.concurrent.locks包下的Lock接口。synchronized提供了一种内置的、不可中断的锁机制,而Lock接口提供了更细粒度的控制,如可重入、公平性和非阻塞尝试获取锁...