Java多线程并发之同步容器和并发容器-第一篇
概述
本文主要讲解在Java多线程并发开发中,集合中有哪些支持并发的的。什么是同步容器(集合),什么是并发容器(集合)?并发容器分类有哪些?每个分类都有哪些类?
本文是《凯哥分享Java并发编程之J.U.C包讲解》系列教程中的第五篇。如果想系统学习,凯哥(kaigejava)建议从第一篇开始看。
从本篇开始,我们就来讲解讲解Java的并发容器。大致思路:先介绍什么是并发容器。然后讲解list相关的、map相关的以及队列相关的。这个系列会有好几篇文章。大家最好跟着一篇一篇学。
正文开始
回顾Java中常用的容器(集合):
我们知道Java内部的容器类是集合相关的。主要包括:List接口、Map接口以及Set接口及其子类。
Collection及Map体系如下图:
我们常用的类关系简化版:
上图中少了一个类:Properties.这个类用的比较少。
我们来简单复习下Java中集合子类及数据结构:
顶级接口 |
二级接口 |
子类 |
数据结构 |
Collection |
List |
Arraylist |
顺序结构动态数组类【数组结构】 |
LinkedList |
链表结构 |
||
Vector |
向量 |
||
Stack |
栈(是Vector的子类) |
||
Set |
HashSet |
哈希表结构(底层是HashMap) |
|
Treeset |
二叉树结构(红黑树)(底层treeMap) |
||
LinkedHashSet |
|||
Map |
HashMap |
链表散列(一个数组和链表的结合体) |
|
TreeMap |
二叉树 |
||
Hashtable |
哈希表 |
说明:关于hashMap是如何解决hash冲撞问题,可以详见凯哥写的:《hashMap怎么保证hash一致性的》这篇文章详细介绍了。
我们知道,绝大部分常用的集合都是线程不安全的,但是也有线程安全的。
其中线程安全的类有:
List接口下的Vector【及Stack(因为stack是Vector的子类)】
Map接口下的:HashTable【及properties(因为properties是HashTable的子类)】
我们来看看为什么vector和HashTable是线程的安全的?
查看vector源码中add方法:
在来看看HashTable源码中put方法:
发现了吗?无论是vector还是hashTable都是使用了Synchronized关键之修饰的。使用了互斥同步锁机制来保证线程安全性的。
在JDK 1.5版本之前,如果想要保证线程安全,使用这两个类或者使用Collections工具类的Synxxx方法来保证线程的安全。
同步容器:
这些使用类Synchronized关键字修饰的容器被称为:同步容器
同步容器的缺点:
但是我们知道使用互斥锁Synchronized在并发下是很影响效率的。那是因为将并行强制转换成串行的。加互斥锁后,只有等一个锁用完之后,下一个才可以接着使用。很影响效率。
在现在大数据高并发下,有没有更好的解决方案呢?当然有的,在JDK1.5版本之后,JDK内部为我们提供了一些并发容器。
并发容器
在一般情况不考虑并发和线程安全性问题的时候,我们使用非线程安全的集合效率更高,如果需要考虑线程安全,不考虑并发或者并发很小的情况下,可以使用同步容器。但是如果在高并发下,同步容器就不能使用了。可以使用并发容器。Java中并发容器在Java.util.concurrent包下。
Concurrent包下有很多并发相关的,本篇我们就来扒拉扒拉众多并发相关类中和并发容器相关的十几个类:
并发容器分类
大致可以分以下三类:
1:List相关的并发容器
2:Map/Set相关的并发容器
为什么把Set划分到Map这个分类下呢?因为在Java的设计中,Set可以理解为阉割版的Map.说白了就是只有Key没有Value的Map.
3:队列相关的并发容器
从名字后缀我们就可以进行区分出来。三个分类相关类如下表:
分类名称 |
类名 |
说明 |
数据结构 |
List相关的并发容器类 |
CopyOnWriteArrayList |
并发版的ArrayList |
|
Map/Set相关的并发容器 |
ConcurrentHashMap |
并发版的HashMap |
|
CopyOnWriteArraySet |
并发版的Set |
||
ConcurrentSkipListMap |
基于跳表的并发Map |
||
ConcurrentSkipListSet |
基于跳表的并发Set |
||
队列相关的并发容器 |
ConcurrentLinkedQueue |
并发对垒 |
基于链表数据结构的 |
ConcurrentLinkedDeque |
并发队列 |
基于双向链表结构 |
|
ArrayBlockingQueue |
阻塞队列 |
基于数组结构 |
|
LinkedBlockingDeque |
阻塞对垒 |
基于双向链表结构 |
|
PriorityBlockingQueue |
线程安全的优先队列 |
||
SynchronousQueue |
读写成对的队列 |
||
LinkedTransferQueue |
基于链表的数据交换队列 |
||
DelayQueue |
延时队列 |
题外话:通过上表,我们可以看出JDK中类命名规则。
1:Map/Set相关的就以Map/Set结尾;List相关的就以list结尾
2:当选队列都已queue结尾;双向队列都已Deque结尾。
这种类名命名规范:见名知意。在我们自己写代码的时候类命名也应该这样。
言归正传,我们接着来讲解。先来看看第一个类。List对应的并发类.
再下一篇文章中,我们将详细讲解list对应的并发容器以及用代码来测试ArrayList、vector以及CopyOnWriteArrayList在100个线程向list中添加1000个数据后的比较。
凯哥个人博客:www.kaigejava.com
相关推荐
Java多线程知识点梳理: 1. Java线程基础知识 - 线程是程序中独立的、并发的执行路径。每个线程都有自己的堆栈、程序计数器和局部变量,但与分隔的进程不同,线程之间的隔离程度较小,它们共享内存、文件句柄等...
《实战Java高并发程序设计》第二版是一本深入探讨Java多线程和并发编程的书籍。这本书涵盖了Java并发编程的核心概念和技术,旨在帮助开发者在实际项目中高效地处理高并发场景。随书附带的代码提供了丰富的示例,以便...
通过深入学习《JAVA并发编程艺术》,开发者能更好地理解并发编程的原理,熟练运用Java提供的并发工具和API,解决实际开发中的多线程问题,提高软件的性能和稳定性。这是一本值得每一位Java开发者研读的书。
3. **并发容器**:书中深入讨论了Java并发容器,如ArrayList、LinkedList、HashSet、HashMap以及并发优化过的ConcurrentHashMap、CopyOnWriteArrayList和CopyOnWriteArraySet等,以及它们在多线程环境下的性能和使用...
本篇将深入探讨如何利用Java多线程技术来优化这种高负载场景。 首先,理解Java多线程的基础至关重要。在Java中,线程是程序执行的最小单元,可以通过实现`Runnable`接口或继承`Thread`类来创建线程。创建多线程的...
2. **并发容器**:Java提供了一系列优化过的并发容器,如`ConcurrentHashMap`、`BlockingQueue`、`CountDownLatch`和`CyclicBarrier`等,这些容器在多线程环境下提供了高效且安全的数据共享机制。 3. **并发设计...
第1章 简介 1.1 并发简史 1.2 线程的优势 1.2.1 发挥多处理器的强大能力 1.2.2 建模的简单性 1.2.3 异步事件的简化处理 1.2.4 响应更灵敏的用户界面 1.3 线程带来的风险 1.3.1 安全性问题 1.3.2 活跃性...
这五本书籍,包括《JAVA并发编程 核心方法与框架》、《Java并发编程:设计原则与模式(第二版)》、《Java并发编程实战(中文版)》、《Java多线程编程核心技术_完整版》以及《Java多线程编程实战指南 设计模式篇》...
1. **Java多线程并发**:在Java中,多线程并发是性能优化的关键。它允许程序同时执行多个任务,提高系统的资源利用率。Java提供了多种创建和管理线程的方式,如Thread类、Runnable接口、Executor框架等。理解线程...
- **并发容器**:Java并发工具包提供了一系列专门用于多线程环境下的容器类,如`ConcurrentHashMap`、`CopyOnWriteArrayList`等,这些容器类在设计时考虑了线程安全性问题,可以减少同步开销。 #### 八、结语 通过...
### 并发容器和线程池 #### 一、并发容器 ##### 1.1 概述 在Java中,为了提高程序的并发处理能力,Java标准库提供了多个线程安全的并发容器,它们主要位于`java.util.concurrent`包中。这些容器能够有效地管理...
《Java线程(第三版)》是一本深入探讨Java线程技术的专业书籍,旨在帮助开发者理解和掌握Java平台上的多线程编程。Java线程是并发编程的重要组成部分,它允许程序同时执行多个任务,从而充分利用系统资源,提高程序的...
Java并发编程技术是Java开发中的重要领域,它涉及到如何在多线程环境下高效地执行程序。并发编程可以充分利用多核处理器资源,提高系统的响应速度和处理能力。以下是一些核心的知识点: 1. **并行程序**:并行程序...
总的来说,徐培成老师的这堂课将帮助初学者深入理解Java多线程编程的基础知识,掌握多线程复制的具体实现,以及如何在实际开发中有效地利用多线程提升程序性能。通过学习,你将能够创建安全、高效的多线程Java应用,...
第1节你真的了解并发吗? [免费观看][免费观看] 00:27:48分钟 | 第2节理解多线程与并发的之间的联系与区别 [免费观看] 00:11:59分钟 | 第3节解析多线程与多进程的联系以及上下文切换所导致资源浪费问题 [免费观看]...
为了克服这些困难,作者们在第一章中探讨了多种解决方案和技术,比如使用同步机制、锁优化策略以及无锁编程技术等。通过详细介绍这些问题的本质原因及其解决方案,帮助读者建立扎实的基础,以便更好地理解后续章节的...
Java多线程系列第二部分主要关注的是对象变量的并发访问问题。在多线程环境中,对象变量的访问可能会引发数据不一致性或数据污染,因此理解线程安全与线程不安全的概念至关重要。 线程安全是指当多个线程同时访问一...
第1章 简介 1.1 并发简史 1.2 线程的优势 1.2.1 发挥多处理器的强大能力 1.2.2 建模的简单性 1.2.3 异步事件的简化处理 1.2.4 响应更灵敏的用户界面 1.3 线程带来的风险 1.3.1 安全性问题 1.3.2 活跃性...
Java提供了丰富的并发工具和API,如线程、锁、同步块、原子变量、并发容器等,而《Java并发编程实践》这本书正是对这些工具和最佳实践的详细解读。 1. **线程与进程**:在计算机系统中,线程是程序执行的基本单位,...
《实战Java高并发程序设计》是一本深入探讨Java并发编程的书籍,其源码整理包含了大量实际示例和实践案例,旨在帮助读者更好地理解和掌握Java并发处理的核心技术。在这个压缩包中,"src"文件夹很可能是存放了书中...