IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> Java多线程并发之同步容器和并发容器-第一篇 -> 正文阅读

[数据结构与算法]Java多线程并发之同步容器和并发容器-第一篇

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对应的并发类.

  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2021-12-01 17:57:48  更:2021-12-01 17:59:27 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 14:33:39-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码