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个数据后的比较。

Java多线程并发之同步容器和并发容器-第一篇的更多相关文章

  1. java多线程总结-同步容器与并发容器的对比与介绍

    1 容器集简单介绍 java.util包下面的容器集主要有两种,一种是Collection接口下面的List和Set,一种是Map, 大致结构如下: Collection List LinkedLis ...

  2. Java并发——同步容器与并发容器

    同步容器类 早期版本的JDK提供的同步容器类为Vector和Hashtable,JDK1.2 提供了Collections.synchronizedXxx等工程方法,将普通的容器继续包装.对每个共有方 ...

  3. Java并发—同步容器和并发容器

    简述同步容器与并发容器 在Java并发编程中,经常听到同步容器.并发容器之说,那什么是同步容器与并发容器呢?同步容器可以简单地理解为通过synchronized来实现同步的容器,比如Vector.Ha ...

  4. Java并发(9)- 从同步容器到并发容器

    引言 容器是Java基础类库中使用频率最高的一部分,Java集合包中提供了大量的容器类来帮组我们简化开发,我前面的文章中对Java集合包中的关键容器进行过一个系列的分析,但这些集合类都是非线程安全的, ...

  5. Java多线程-线程的同步(同步方法)

    线程的同步是保证多线程安全访问竞争资源的一种手段.线程的同步是Java多线程编程的难点,往往开发者搞不清楚什么是竞争资源.什么时候需要考虑同步,怎么同步等等问题,当然,这些问题没有很明确的答案,但有些 ...

  6. Java——多线程之对象及变量的并发访问

    Java多线系列文章是Java多线程的详解介绍,对多线程还不熟悉的同学可以先去看一下我的这篇博客Java基础系列3:多线程超详细总结,这篇博客从宏观层面介绍了多线程的整体概况,接下来的几篇文章是对多线 ...

  7. java多线程---4 线程同步介绍及不安全案例说明

    java多线程---4 线程同步介绍及不安全案例说明 线程同步 并发: 同一个对象被多个线程同时操作. 处理多线程问题时,多个线程访问同一个对象,并且某些线程还想修改这个对象,这时候我们就需要线程同步 ...

  8. 关于Java多线程的线程同步和线程通信的一些小问题(顺便分享几篇高质量的博文)

    Java多线程的线程同步和线程通信的一些小问题(顺便分享几篇质量高的博文) 前言:在学习多线程时,遇到了一些问题,这里我将这些问题都分享出来,同时也分享了几篇其他博客主的博客,并且将我个人的理解也分享 ...

  9. Java中常用的七个阻塞队列介绍第一篇

    Java中常用的七个阻塞队列介绍第一篇 在上一篇我们对Java中的队列分类做了简单的介绍.本文咱们主要来聊聊阻塞队列中的七个常用子类.这七个阻塞队列的学习步骤:先看源码,分析完源码之后,我们再来对每个 ...

  10. 【Java并发编程二】同步容器和并发容器

    一.同步容器 在Java中,同步容器包括两个部分,一个是vector和HashTable,查看vector.HashTable的实现代码,可以看到这些容器实现线程安全的方式就是将它们的状态封装起来,并 ...

随机推荐

  1. Linux系统基本介绍

    一.Linux系统基本介绍 [1].Linux操作系统特点 多任务的操作系统 多任务操作系统 严格区分大小写 Linux一切皆文件 所有文件的起点都是"/"根目录 对于Linux操 ...

  2. python 转换PDF 到 EPS

    from win32com.client.dynamic import ERRORS_BAD_CONTEXT as ebc from win32com.client import DispatchEx ...

  3. Python代码学习

    1.生成四位数字字母验证码,大小写字母随机 import random if __name__ =="__main__": #四位数字字母验证码的生成 checkcode=&quo ...

  4. linux信号机制(初识版)

    转载 https://www.zhihu.com/question/24913599/answer/2584544572 信号是操作系统内核为我们提供用于在进程间通信的机制,内核可以利用信号来通知进程 ...

  5. CPU的实模式

    实模式是指CPU的寻址方式,寄存器大小,指令用法等,是用来反应CPU在该环境下如何工作的概念. CPU的工作原理:CPU大体分为三个部分,控制.运算.存储单元. 控制单元是CPU的控制中心,大致由指令 ...

  6. 背景色透明度兼容IE8的写法

    本文为Echoyya.所创,转载请带上原文链接,感谢 https://www.cnblogs.com/echoyya/p/14236242.html 通常的做法 目前大多数浏览器都支持 CSS3,只需 ...

  7. oeasy教您玩转vim - 7 - # 从头插入

    另存与保存 回忆上节课内容 上次我们学会了另存为命令 : saveas {file} 还有这个直接保存命令 : w 真的可以把修改存了 下面我们来研究插入命令的细节. 插入命令 首先我们可以查询这个插 ...

  8. 从DDPM到DDIM(四) 预测噪声与后处理

    从DDPM到DDIM(四) 预测噪声与后处理 前情回顾 下图展示了DDPM的双向马尔可夫模型. 训练目标.最大化证据下界等价于最小化以下损失函数: \[\boldsymbol{\theta}^*=\u ...

  9. mysql执行步骤口诀:发连缓分析,优化执行器

    mysql执行步骤口诀:发连缓分析,优化执行器 mysql执行步骤: 1.我们在客户端发起一个SQL的查询: 2.连接器判断用户登录以及用户权限: 3.缓存命中,走缓存(mysql缓存不是redis缓 ...

  10. Linux环境 yum,apt-get,rpm,wget 区别

    Linux环境 yum,apt-get,rpm,wget 区别 一般来说linux系统基本上分两大类:cat /etc/issue查看linux系统版本RedHat系列:Redhat.Centos.F ...