AQS
juc很多操作都是基于AQS(AbstractQueuedSynchronizer)
不同于自旋锁,juc使用的是volatile机制的状态变量;
内部也有一个阻塞线程的等待队列
每个线程都被封装在一个Node结点中
static final class Node { // 当前线程被取消 static final int CANCELLED = 1; // 结点被移除队列时唤醒后继节点 static final int SIGNAL = -1; // 结点在条件队列里面 static final int CONDITION = -2; /** * waitStatus value to indicate the next acquireShared should * unconditionally propagate */ static final int PROPAGATE = -3; /** Marker to indicate a node is waiting in shared mode */ static final Node SHARED = new Node(); /** Marker to indicate a node is waiting in exclusive mode */ static final Node EXCLUSIVE = null; volatile int waitStatus; volatile Node prev; volatile Node next; /** * The thread that enqueued this node. Initialized on * construction and nulled out after use. */ volatile Thread thread; Node nextWaiter; /** * Returns true if node is waiting in shared mode */ final boolean isShared() { return nextWaiter == SHARED; } final Node predecessor() throws NullPointerException { Node p = prev; if (p == null) throw new NullPointerException(); else return p; } Node() { // Used to establish initial head or SHARED marker } Node(Thread thread, Node mode) { // Used by addWaiter this.nextWaiter = mode; this.thread = thread; } Node(Thread thread, int waitStatus) { // Used by Condition this.waitStatus = waitStatus; this.thread = thread; } }
等待锁时线程封装进入队列尾部或者成为唯一节点,锁释放时,队列头部节点出对;
Lock
可重入锁的设计
内部继承AQS的Sync类来实现锁相关操作,线程可以重复获得锁,内部计数器在每次获得锁时计数器加1,计数器变为0时,锁释放;
锁获取实现:acquire()方法先尝试一次tryAcquire操作,如果失败,则调用acquireQueue()方法把当前线程加入到同步队列中去,这个时候可能会反复的阻塞与唤醒这个线程,直到后续的tryAcquire操作成功。
锁释放实现:将state值减1,然后判断锁是否被完全释放,如果被完全释放,则唤醒继任节点。
Condition
条件变量的实现,类似于OS中的信号量的实现,是实现BlockingQueue的基础,变量value>=0时表示有多少资源可以分配,当value<0时,表示欠缺多少资源,线程必须在等待队列中排队。
主要操作是await(),signal()
Signal()操作在资源可用时唤醒相应线程
Await()操作在资源不可用时线程必须等待
二者必须配对存在。
ReadWriteLock
读写锁的实现,读写锁分为读锁和写锁,读取数据必须获取读锁,可以存在多个读锁,但写锁必须只能存在一个,读锁写锁之间互斥。
Java读写锁在设计上采用volatile状态变量、CAS数据更新机制和条件变量结合的策略,获取读锁是,如果写锁被线程拥有,那么读者进入等待队列,否则可以获取锁,获取写锁时,如果读者仍持有锁,那么写者等待。
相关推荐
### JAVA并发编程与高并发解决方案-并发编程四之J.U.C之AQS #### 引言 《JAVA并发编程与高并发解决方案-并发编程四之J.U.C之AQS》是一篇详细介绍Java实用并发工具包(Java Util Concurrency,简称J.U.C.)中重要...
Java并发编程库,特别是java.util.concurrent(简称J.U.C),是Java语言在多线程处理上的一大亮点。并发编程是一个复杂的话题,因为它涉及到许多高级概念,包括线程安全、死锁、性能优化和原子操作等。J.U.C正是为了...
Java.util.concurrent(简称J.U.C)是Java并发编程的核心库之一,提供了大量的并发容器和原子变量类,以及各种同步工具类。它简化了并发编程中的许多复杂细节,提高了开发效率和程序的稳定性。 ##### 4.2 原子类 J...
### Java并发编程与高并发解决方案之并发容器(J.U.C) #### 并发容器J.U.C 在Java中,为了提供高性能、低延迟的并发数据结构,Java提供了多种并发容器类,这些类主要位于`java.util.concurrent`包内,通常被称为J.U...
Java并发编程是Java程序员需要掌握的关键技能之一,而J.U.C(Java Concurrency Utilities)是Java平台中的核心组件,提供了丰富的工具和接口来处理多线程环境中的并发问题。本资料"J.U.C系列线程安全的理论讲解编程...
**J.U.C(Java Util Concurrency)**是Java并发编程的基石,包含各种线程安全的工具类,如`ExecutorService`,`Semaphore`,`CountDownLatch`等。 **高并发解决方案** 1. **扩容**:可以通过**水平扩容**(增加...
根据提供的文件信息,“JAVA并发编程中文完全版”这本书旨在为读者提供全面且深入的Java并发编程知识。下面将从以下几个方面来阐述此书所涵盖的关键知识点: ### 一、Java并发编程基础 #### 1.1 Java并发模型概述 ...
Java并发编程是Java开发中的重要领域,涉及到多线程、并发控制、同步机制等多个知识点。以下是对Java并发知识体系的详细解析。 首先,我们要理解并发的理论基础。并发是为了提高系统资源利用率和处理能力,让多个...
7. **J.U.C(Java并发工具包)**:这部分将详细介绍`java.util.concurrent`包中的各种工具类,如`Future`、`CompletableFuture`以及`ForkJoinPool`和`RecursiveTask`,它们是Java 7引入的并发处理框架,用于并行计算...
- J.U.C(Java Util Concurrency):Java并发工具包,提供多种并发控制工具类。 - AQS(AbstractQueuedSynchronizer):抽象队列同步器,许多并发工具的基础。 - ThreadLocal:线程局部变量,用于解决线程间的...
Java并发工具包(J.U.C)是Java编程语言中用于并发编程的一系列工具包的统称,它包含了一系列方便实现多线程编程的类和接口,使得开发者可以更加方便地编写高效、线程安全的程序。本文将深入浅出地探讨J.U.C的原理和...
`AbstractQueuedSynchronizer` 是Java并发框架中的核心抽象类,为多种同步工具(如锁、信号量、屏障等)提供了底层支持。AQS的设计目的是为了简化同步组件的实现难度,同时提高其性能表现。 ##### 设计理念 - **...
《Java并发编程的艺术》是一本深入探讨Java平台上的并发编程技术的专业书籍,其源码提供了丰富的实例和示例,帮助读者理解并发编程的核心概念和最佳实践。在Java中,并发编程是开发高效、可扩展应用的关键技能,尤其...
5. **J.U.C框架**:Java并发 utilities (J.U.C) 框架是Java并发编程的重要组成部分,书中会介绍如何利用这个框架来提升并发性能和代码的可读性。 6. **性能调优**:在高并发场景下,性能优化是必不可少的。可能涵盖...
Java并发包(java.util.concurrent, J.U.C)提供了丰富的并发工具和容器,如ConcurrentHashMap、Semaphore、CyclicBarrier等,它们设计用于解决原子性、有序性和可见性问题,简化并发编程。 总之,理解和掌握Java...
为了避免这些常见的陷阱,Java并发编程的实践者需要对J.U.C的API有深入的理解,并熟悉其背后的硬件原理和软件设计思想。只有这样,才能在设计并发程序时做出正确的选择,合理地平衡性能和安全性,编写出既高效又可靠...
Java的并发编程模型在J.U.C(`java.util.concurrent`)包中得到了全面的展现,这不仅仅是Java语言本身的一大亮点,更是多线程编程领域的重要组成部分。本文旨在通过深入浅出的方式探讨J.U.C的关键知识点,为读者提供...
线程和并发处理是Java的强项,脑图可能涵盖了线程的创建、同步机制(如synchronized关键字、Lock接口)、并发工具类(如ExecutorService、Semaphore、CountDownLatch)以及并发设计模式。 Java还支持网络编程,提供...
Java多线程是Java编程中的...同时,面试中可能还会涉及到J.U.C(Java并发包)中的高级特性和最佳实践,例如CountDownLatch、CyclicBarrier、Semaphore等工具类的使用。熟悉并掌握这些内容,将有助于在面试中表现出色。
- **支持多线程**:Java内置了对多线程的支持,可以轻松实现并发编程。 - **两大核心机制**: - **GC(Garbage Collection)**:自动垃圾回收机制,自动管理内存,避免程序员手动释放内存引发的问题。 - **Java...