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对应的并发类.
再下一篇文章中,我们将详细讲解list对应的并发容器以及用代码来测试ArrayList、vector以及CopyOnWriteArrayList在100个线程向list中添加1000个数据后的比较。
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
透过现象看本质——谈谈L2 agent 这回事儿
透过现象看本质——谈谈L2 agent这回事儿 前言 上回说到OpenStack Neutron项目中有关ML2插件的事儿,ML2作为H版本更新后新生代核心插件的宠儿,其实现了network/subnet/port三种核心资源,同时也实现了包括Port Binding等在内的部分扩展资源。ML2插件通过解耦网络拓扑类型与底层的虚拟网络实现机制,并通过Driver的形式进行扩展,解决了传统核心插件的相关问题。 而我们知道在neutron所提供的服务中,插件和代理是对应着的,尽管我们说ML2解决了在使用传统核心插件时所有节点只能使用同一种网络提供者的问题,但是这并非意味着不同的机制驱动可以用与之不同的网络提供者提供代理服务,但其实我们无需考虑这么多,开发者只需要针对agent开发对应的驱动即可。 ML2 Core Plugin及其agent负责将实例连接到OpenStack Layer 2虚拟网络,本文就来谈谈有关Linux Bridge和Open vSwitch代理的内容。 Service和Agent 在Neutron项目中,官方对于服务和代理给出的介绍为:一个常见的Ne...
- 下一篇
Java多线程并发编程中并发容器第二篇之List的并发类讲解
Java多线程并发编程中并发容器第二篇之List的并发类讲解 概述 本文我们将详细讲解list对应的并发容器以及用代码来测试ArrayList、vector以及CopyOnWriteArrayList在100个线程向list中添加1000个数据后的比较 本文是《凯哥分享Java并发编程之J.U.C包讲解》系列教程中的第六篇。如果想系统学习,凯哥(kaigejava)建议从第一篇开始看。 从本篇开始,我们就来讲解讲解Java的并发容器。大致思路:先介绍什么是并发容器。然后讲解list相关的、map相关的以及队列相关的。这个系列会有好几篇文章。大家最好跟着一篇一篇学。 联系凯哥: 个人博客:www.kaigejava.com 正文开始 并发容器分类讲解 CopyOneWriteArrayList Copy-One-Write:即写入时候复制。 我们知道在原来List子类中vactor是同步容器线程安全的。这个CopyOneWriteArrayList可以理解为是他的并发替代品。 其底层数据结构也是数值。和ArrayList的不同之处就在于:在list对象中新增或者是删除元素的时候会把原来的...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
-
Docker使用Oracle官方镜像安装(12C,18C,19C)
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- CentOS8编译安装MySQL8.0.19
- Docker快速安装Oracle11G,搭建oracle11g学习环境
- SpringBoot2配置默认Tomcat设置,开启更多高级功能
- MySQL8.0.19开启GTID主从同步CentOS8
- CentOS7,8上快速安装Gitea,搭建Git服务器
- Jdk安装(Linux,MacOS,Windows),包含三大操作系统的最全安装
- SpringBoot2编写第一个Controller,响应你的http请求并返回结果
推荐阅读
最新文章
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- Docker使用Oracle官方镜像安装(12C,18C,19C)
- CentOS6,CentOS7官方镜像安装Oracle11G
- SpringBoot2整合Redis,开启缓存,提高访问速度
- Jdk安装(Linux,MacOS,Windows),包含三大操作系统的最全安装
- SpringBoot2配置默认Tomcat设置,开启更多高级功能
- SpringBoot2整合MyBatis,连接MySql数据库做增删改查操作
- Hadoop3单机部署,实现最简伪集群
- MySQL8.0.19开启GTID主从同步CentOS8
- SpringBoot2编写第一个Controller,响应你的http请求并返回结果