iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > Python >JAVA 并发容器的一些易出错点你知道吗
  • 523
分享到

JAVA 并发容器的一些易出错点你知道吗

2024-04-02 19:04:59 523人浏览 泡泡鱼

Python 官方文档:入门教程 => 点击学习

摘要

目录并发容器ListSetMapQueue单端阻塞队列双端阻塞队列单端非阻塞队列双端非阻塞队列有界与无界队列总结并发容器 与同步容器一样,并发容器在总体上也可以分为四大类,分别为:L

并发容器

与同步容器一样,并发容器在总体上也可以分为四大类,分别为:List、Set、Map和Queue。总体上如下图所示。

在这里插入图片描述

接下来,我们分别介绍下这些并发容器在使用时的注意事项和避免踩到的坑。

List

并发容器中的List相对来说比较简单,就一个CopyOnWriteArrayList。大家可以从字面的意思中就能够体会到:CopyOnWrite,在写的时候进行复制操作,也就是说在进行写操作时,会将共享变量复制一份。那这样做有什么好处呢?最大的好处就是:读操作可以做到完全无化。

在CopyOnWriteArrayList内部维护了一个数组,成员变量array指向这个数组,其核心源代码如下所示。


private transient volatile Object[] array;
final Object[] getArray() {
	return array;
}
final void setArray(Object[] a) {
	array = a;
}

当进行操作时,都是基于array指向的这个内部数组进行的。例如,我们使用Iterator迭代器遍历这个数组时,会按照下图所示的方式进行读操作。

在这里插入图片描述

如果在遍历CopyOnWriteArrayList时发生写操作,例如,向数组中增加一个元素时,CopyOnWriteArrayList则会将内部的数组复制一份出来,然后会在新复制出来的数组上添加新的元素,添加完再将array指向新的数组,如下图所示。

在这里插入图片描述

对于CopyOnWriteArrayList的其他写操作和添加元素的操作原理相同,这里就不再赘述了。

使用CopyOnWriteArrayList时需要注意的是:

CopyOnWriteArrayList只适合写操作比较少的场景,并且能够容忍读写操作在短时间内的不一致。CopyOnWriteArrayList的迭代器是只读的,不支持写操作。

Set

对于Set接口来说,并发容器中主要有两个实现类,一个是CopyOnWriteArraySet,另一个是ConcurrentSkipListSet。其中,

CopyOnWriteArraySet的使用场景、原理与注意事项和CopyOnWriteArrayList一致。而ConcurrentSkipListSet的使用场景、原理和注意事项和下文的ConcurrentSkipListMap一致。这里,我就不再赘述啦。

Map

在并发容器中,Map接口的实现类主要有ConcurrentHashMap和ConcurrentSkipListMap,而ConcurrentHashMap和ConcurrentSkipListMap最大的区别就是:ConcurrentHashMap的Key是无序的,而ConcurrentSkipListMap的Key是有序的。

在使用ConcurrentHashMap和ConcurrentSkipListMap时,需要注意的是:ConcurrentHashMap和ConcurrentSkipListMap的Key和Value都不能为空。

这里,我们可以将Map相关的类总结成一个表格,如下所示。

Map的实现类Key是否可为空Value是否可为空是否是线程安全
HashMap
TreeMap
HashTable
ConcurrentHashMap
ConcurrentSkipListMap

这样,大家记忆起来就方便多了。

这里,ConcurrentSkipListMap是基于“跳表”实现的,跳表的插入、删除、查询的平均时间复杂度为O(log n),这些时间复杂度在理论上与线程数没有关系。如果要追求性能的话,可以尝试使用ConcurrentSkipListMap。

Queue

在Java的并发容器中,Queue相对来说比较复杂。我们先来了解几个概念:

  • 阻塞队列:阻塞一般就是指当队列已满时,入队操作会阻塞;当队列为空时,出队操作就会阻塞。
  • 非阻塞队列:队列的入队和出队操作不会阻塞。
  • 单端队列:队列的入队操作只能在队尾进行,队列的出队操作只能在队首进行。
  • 双端队列:队列的入队操作和出队操作都可以在队首和队尾进行。

我们可以将上述的队列进行组合,将队列分为单端阻塞队列、双端阻塞队列、单端非阻塞队列和双端非阻塞队列。

在这里插入图片描述

在Java的并发容器中,会使用明显的标识来区分不同类型的队列。

  • 阻塞队列一个明显的标识就是使用Blocking修饰,例如,ArrayBlockingQueue和LinkedBlockingQueue都是阻塞队列。
  • 单端队列会使用Queue标识,例如ArrayBlockingQueue和LinkedBlockingQueue也是单端队列。
  • 双端队列会使用Deque标识,例如LinkedBlockingDeque和ConcurrentLinkedDeque都是双端队列。

接下来,我们就分别简单聊聊这四种类型的队列。

单端阻塞队列

在Java的并发容器中,单端阻塞队列的主要实现是BlockingQueue,主要包括:ArrayBlockingQueue、LinkedBlockingQueue、SynchronousQueue、LinkedTransferQueue、PriorityBlockingQueue和DelayQueue。

在这里插入图片描述

单端阻塞队列的内部一般会有一个队列。

在实现上,内部的队列可以是数组,例如ArrayBlockingQueue,也可以是链表,例如LinkedBlockingQueue。

也可以在内部不存在队列,例如SynchronousQueue,SynchronousQueue实现了生产者的入队操作必须等待消费者的出队操作完成之后才能进行。

LinkedTransferQueue集成了LinkedBlockingQueue和SynchronousQueue的优点,并且性能比LinkedBlockingQueue好。

PriorityBlockingQueue实现了按照优先级进行出队操作,也就是说,队列元素在PriorityBlockingQueue内部可以按照某种规则进行排序

DelayQueue是延时队列,实现了在一段时间后再出队的操作。

双端阻塞队列

双端阻塞队列的实现主要是LinkedBlockingDeque。示意图如下所示。

在这里插入图片描述

单端非阻塞队列

单端非阻塞队列的实现主要是ConcurrentLinkedQueue,示意图如下所示。

在这里插入图片描述

双端非阻塞队列

双端非阻塞队列的实现主要是ConcurrentLinkedDeque,示意图如下所示。

在这里插入图片描述

有界与无界队列

使用队列时,还要注意队列的有界与无界问题,也就是在使用队列时,需要注意队列是否有容量限制。

在实际工作中,一般推荐使用有界队列。因为无界队列很容易导致内存溢出的问题。在Java的并发容器中,只有ArrayBlockingQueue和LinkedBlockingQueue支持有界,其他的队列都是无界队列。

在使用时,一定要注意内存溢出问题。

总结

今天我们主要介绍了jdk1.5之后提供的并发容器,主要包括:List、Set、Map和Queue,而Queue又可以分为:单端阻塞队列、双端阻塞队列、单端非阻塞队列和双端非阻塞队列。对于每种并发容器,我们简单介绍了其基本原理和注意事项。

本篇文章就到这里了,希望能够给你带来帮助,也希望您能够多多关注编程网的更多内容!

--结束END--

本文标题: JAVA 并发容器的一些易出错点你知道吗

本文链接: https://www.lsjlt.com/news/134366.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • JAVA 并发容器的一些易出错点你知道吗
    目录并发容器ListSetMapQueue单端阻塞队列双端阻塞队列单端非阻塞队列双端非阻塞队列有界与无界队列总结并发容器 与同步容器一样,并发容器在总体上也可以分为四大类,分别为:L...
    99+
    2024-04-02
  • Java代码审计的一些基础知识你知道吗
    目录JSP生命周期详细过程:War包结构JAVA 内置对象JAVA 中的危险函数名词概念总结JSP生命周期 关键词:Web服务器,JSP容器,JVM(Java虚拟机),servlet...
    99+
    2024-04-02
  • 你真的知道 JavaScript 在 Java 容器中的作用吗?
    JavaScript 和 Java 是两种不同的编程语言,它们的用途和应用场景也不尽相同。但是,在 Java 容器中,JavaScript 也有着不可替代的作用。 JavaScript 是一种脚本语言,它最初是为了在网页中实现交互效果而开发...
    99+
    2023-09-12
    容器 git javascript
  • 你知道吗?Python并发、API和容器之间有着神秘的联系!
    Python作为一种高级编程语言,已经成为了许多开发者和数据科学家的首选工具。Python的优点在于它的可读性、易用性和强大的库支持,这些都让开发过程变得更加高效和简单。但是,Python的并发、API和容器之间的联系却很少被人提及。本文将...
    99+
    2023-11-15
    并发 api 容器
  • Python 容器开发技术的奥秘,你想知道吗?
    Python 是一种高级编程语言,具有动态语言的特性,易于学习和使用。Python 的优势之一就是它的容器类型,这些类型包括列表、元组、字典和集合。Python 的容器类型非常强大,使得我们可以轻松地处理和操作大量数据。本文将深入探讨 P...
    99+
    2023-09-07
    学习笔记 容器 开发技术
  • Java存储在Spring容器中的秘密:你知道吗?
    在Java开发中,Spring框架被广泛应用于开发大型Web应用程序。其中,Spring容器是一个非常重要的组件,它负责管理JavaBean的生命周期和依赖注入。但是,你知道吗?Spring容器中有一些非常有用的特性,它们可以让你更好地管...
    99+
    2023-11-02
    存储 spring 容器
  • NumPy函数在Java容器中的应用:你知道吗?
    NumPy是一个用于科学计算和数据分析的Python库,被广泛应用于机器学习、数据挖掘、信号处理等领域。然而,你是否知道NumPy函数在Java容器中也可以应用呢?本文将为大家详细介绍NumPy函数在Java容器中的应用。 一、NumPy函...
    99+
    2023-07-03
    numy 函数 容器
  • Python并发:API、容器、还有什么是你不知道的?
    Python是一种高级编程语言,已经成为了许多领域的首选语言,包括Web开发、数据科学、机器学习等等。Python在并发编程方面也有着出色的表现。本文将介绍Python的并发编程API、容器以及一些你可能不知道的技巧。 Python并发编...
    99+
    2023-11-15
    并发 api 容器
  • ASP路径中的容器:你需要知道的一切吗?
    ASP(Active Server Pages)是一种基于服务器端脚本的Web开发技术,它可以生成动态的Web页面,并且可以连接各种数据库系统。在ASP中,路径是一个非常重要的概念,它用于指定文件和目录的位置。而路径中的容器则是指定路径的...
    99+
    2023-11-13
    path 关键字 容器
  • 你知道如何在 Go 中使用容器来实现并发操作吗?
    当今的软件开发中,容器技术已经成为了一种非常流行的解决方案。特别是在 Go 语言中,容器技术更是成为了实现并发操作的一个重要工具。在本文中,我们将详细介绍如何在 Go 中使用容器来实现并发操作。 一、什么是容器技术? 在软件开发中,容器技术...
    99+
    2023-07-29
    shell 容器 并发
  • 你知道Java中使用npm管理容器的好处吗?
    Java是一种非常流行的编程语言,而npm则是Node.js的包管理器。虽然这两个技术似乎不相关,但在使用Java开发容器化应用时,使用npm管理容器却是非常有好处的。 在本文中,我们将介绍Java中使用npm管理容器的好处,并演示如何使用...
    99+
    2023-10-21
    容器 关键字 npm
  • 你知道吗?Python 容器在 Linux 上的运行效果超出你的想象!
    Python 容器在 Linux 上的运行效果超出你的想象! Python 作为一门高级编程语言,广泛应用于各种领域。而容器技术则是近年来快速崛起的技术,它能够让应用程序在不同的环境中运行,从而更加灵活和可靠。本文将介绍 Python 容器...
    99+
    2023-08-23
    容器 自然语言处理 linux
  • 你知道吗?使用Go语言可以在Unix容器中实现高并发!
    随着互联网技术的不断发展,高并发处理成为了一个越来越重要的问题。而在处理高并发时,使用Go语言可以带来很大的优势。本文将介绍如何在Unix容器中使用Go语言实现高并发,并提供相关的演示代码。 一、什么是Unix容器? Unix容器是一种轻...
    99+
    2023-10-09
    并发 unix 容器
  • 你知道Java中哪些关键字可以优化并发编程算法吗?
    Java是一门广泛应用于高并发编程的语言,因此在进行并发编程时,了解Java中哪些关键字可以优化并发编程算法是非常重要的。下面,本文将介绍Java中优化并发编程算法的关键字,并提供相应的演示代码。 synchronized synchr...
    99+
    2023-10-22
    并发 关键字 编程算法
  • Laravel与Java容器同步方案:你需要知道的一切!
    随着云计算、容器化技术的发展,越来越多的企业选择将应用程序部署在容器中。而Laravel和Java是两个非常流行的应用程序框架,因此,如何实现Laravel和Java容器之间的同步成为了一个重要的问题。 在本文中,我们将介绍如何实现Lar...
    99+
    2023-09-14
    容器 同步 laravel
  • 你知道哪些适用于go的存储框架和容器吗?
    在现代化的应用程序中,数据存储是不可避免的。Go语言是一种流行的编程语言,它提供了一些可靠的存储框架和容器,以使数据管理更加便捷。在本文中,我们将介绍一些适用于Go语言的存储框架和容器。 存储框架 1. GORM GORM是Go语言中一个流...
    99+
    2023-10-07
    存储 框架 容器
  • Java 并发编程中的对象存储技术:你需要知道的一切!
    在 Java 并发编程中,对象存储技术是一个非常重要的话题。随着多核处理器的广泛应用,为了充分利用多核处理器的性能,Java 并发编程技术已经成为了不可或缺的一部分。在本文中,我们将深入探讨 Java 并发编程中的对象存储技术,帮助读者更...
    99+
    2023-08-14
    存储 并发 对象
  • Go并发编程和Docker容器化:你需要知道的关键细节
    Go语言作为一门高效的编程语言,它的并发编程和Docker容器化技术已经成为了当前互联网开发的主流。本文将介绍你需要了解的关键细节,以及一些演示代码供你参考。 一、Go并发编程 Go语言天生支持并发编程,它提供了一些特殊的关键字,如go和...
    99+
    2023-08-14
    并发 bash 容器
  • 你知道吗?ASP 容器中的数组处理算法可以有哪些应用?
    ASP(Active Server Pages)是一种用于创建动态网站的技术,它可以让开发者使用 VBScript 或 JScript 来编写代码,生成动态网页。在 ASP 中,数组处理算法是非常重要的一部分,因为它可以帮助开发者更加高效地...
    99+
    2023-10-25
    容器 编程算法 数组
  • 你需要知道的一切:使用Java和Unix构建高效的索引容器。
    在当今信息爆炸的时代,如何快速有效地检索所需信息是一个很重要的问题。索引容器是一种非常常见的工具,用于快速检索和查询数据。本文将介绍如何使用Java和Unix构建高效的索引容器。 什么是索引容器? 索引容器是一种数据结构,用于快速检索和查询...
    99+
    2023-10-08
    unix 索引 容器
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作