java中自带有并发属性的List总结

 更新时间:2023年09月14日 16:14:35   作者:flydean  
java中有很多list,但是原生支持并发的并不多,那么java中的并发list到底有哪些呢?下面小编就来给大家介绍一下ArrayList、CopyOnWriteArrayList、ConcurrentLinkedDeque这几个吧

java中有很多list,但是原生支持并发的并不多,我们在多线程的环境中如果想同时操作同一个list的时候,就涉及到了一个并发的过程,这时候我们就需要选择自带有并发属性的list,那么java中的并发list到底有哪些呢?今天要给大家介绍的是ArrayListCopyOnWriteArrayListConcurrentLinkedDeque这几个。

各种list的优缺点

当涉及到并发编程时,不同的 List 实现具有各自的优点和缺点。下面是对 ArrayListCopyOnWriteArrayListConcurrentLinkedDeque 的优缺点进行详细比较的描述:

ArrayList:

优点:

  • 简单易用:ArrayList 是 Java 中最基本的动态数组,易于理解和使用。
  • 高效的随机访问:由于内部基于数组实现,因此具有良好的随机访问性能。

缺点:

  • 非线程安全:ArrayList 不是线程安全的,当多个线程同时修改它时会出现竞态条件。
  • 需要外部同步:为了使 ArrayList 在多线程环境下安全,需要额外的同步措施,如使用 Collections.synchronizedList

CopyOnWriteArrayList:

优点:

  • 线程安全:CopyOnWriteArrayList 是线程安全的,多个线程可以同时读取而不会出现问题。
  • 适用于读多写少的情况:由于写操作会复制整个数组,适用于读多写少的情况,例如日志记录。

缺点:

  • 写操作开销大:每次写操作都会复制整个列表,因此写操作的开销较大,不适合高频写入操作。
  • 数据不是实时的:由于写操作的复制过程,读操作可能会看到旧数据,因此不适用于需要实时数据的场景。

ConcurrentLinkedDeque:

优点:

  • 高并发:ConcurrentLinkedDeque 针对高并发读写进行了优化,适用于需要高并发处理的情况。
  • 低延迟:添加和删除操作的性能很好,不会导致锁争用。

缺点:

  • 不支持随机访问:ConcurrentLinkedDeque 不支持随机访问元素,因为它是一个双端队列,只能从队头和队尾进行操作。
  • 不适用于所有场景:不适合需要随机访问的场景,例如需要根据索引查找元素的情况。

总的来说,选择哪种 List 实现取决于您的具体需求。如果您需要高度并发且读写操作相对平衡,ConcurrentLinkedDeque 可能是更好的选择。如果您主要进行读操作且能够容忍写操作的开销,CopyOnWriteArrayList 是一个不错的选择。如果您只在单线程环境下操作,ArrayList 可能是更简单的选择,但需要注意同步问题。

他们的实现原理

理解这些并发 List 实现的原理对于正确使用它们非常重要。以下是这些 List 的实现原理:

ArrayList:

  • 实现:ArrayList 基于动态数组实现。它内部维护一个对象数组,可以根据需要进行自动扩展。
  • 原理:ArrayList 支持随机访问,因为可以通过索引直接访问元素。添加元素时,它会检查容量是否足够,如果不够,会创建一个更大的数组并将元素复制到新数组中。这可能导致内部数组的重新分配和复制,因此在多线程环境下需要额外的同步来确保线程安全。

CopyOnWriteArrayList:

  • 实现:CopyOnWriteArrayList 也是基于数组实现的,但与普通的 ArrayList 不同,它在写操作时不直接修改现有数组,而是创建一个新的副本。
  • 原理:读操作在不需要锁的情况下并发执行,因为它们始终访问当前的数组。写操作会复制当前数组的内容到一个新数组上,然后执行修改操作。这确保了读操作不受写操作的影响。虽然写操作需要额外的内存和复制,但读操作非常高效,适用于读多写少的场景。

ConcurrentLinkedDeque:

  • 实现:ConcurrentLinkedDeque 是一个双端队列,它使用节点来连接元素。每个节点都包含一个元素和指向前一个和后一个节点的引用。
  • 原理:在多线程环境下,ConcurrentLinkedDeque 使用CAS(比较并交换)操作来实现并发。添加元素时,它会在队头或队尾创建新的节点,然后通过CAS操作将新节点连接到队列中。删除元素时,会通过CAS来更改节点的引用,以确保线程安全。由于没有全局锁,ConcurrentLinkedDeque 允许高并发的添加和删除操作,但不支持随机访问。

总之,这些并发 List 的实现原理都是为了在多线程环境下提供高并发性能和线程安全。不同的实现方式适用于不同的使用场景。

使用举例

在多线程Java应用程序中,处理数据的并发访问是一个常见的挑战。这里将介绍四种支持并发的容器:ArrayListCopyOnWriteArrayListConcurrentLinkedDeque的用法和代码实现。

ArrayList

使用示例

以下是一个使用ArrayList的示例:

List<String> arrayList = Collections.synchronizedList(new ArrayList<>());
// 添加元素
arrayList.add("元素1");
arrayList.add("元素2");
// 迭代元素
for (String element : arrayList) {
    System.out.println(element);
}

CopyOnWriteArrayList

使用示例

下面是一个使用CopyOnWriteArrayList的示例:

CopyOnWriteArrayList<String> copyOnWriteArrayList = new CopyOnWriteArrayList<>();
// 添加元素
copyOnWriteArrayList.add("元素1");
copyOnWriteArrayList.add("元素2");
// 迭代元素
for (String element : copyOnWriteArrayList) {
    System.out.println(element);
}

ConcurrentLinkedDeque

使用示例

ConcurrentLinkedDeque的使用示例如下:

ConcurrentLinkedDeque<String> concurrentLinkedDeque = new ConcurrentLinkedDeque<>();
// 添加元素
concurrentLinkedDeque.offer("元素1");
concurrentLinkedDeque.offer("元素2");
// 获取并移除元素
String element = concurrentLinkedDeque.poll();
System.out.println("取出元素:" + element);

选择最适合您的容器

在实际应用中,您应该根据需求选择最适合的容器。如果需要高并发的读取操作,可以考虑使用CopyOnWriteArrayList。如果需要高并发的添加和移除元素操作,可以使用ConcurrentLinkedDeque。最终,根据项目要求和性能需求来选择适当的容器。

总结

Java提供了多种支持并发的容器,如ArrayList、CopyOnWriteArrayList、ConcurrentLinkedDeque。了解它们的用法和性能特点对于编写高效的多线程程序至关重要。选择正确的容器可以显著提高应用程序的性能和可靠性。

到此这篇关于java中自带有并发属性的List总结的文章就介绍到这了,更多相关java list内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • java UDP实现一个聊天工具的示例代码

    java UDP实现一个聊天工具的示例代码

    这篇文章主要介绍了java UDP实现一个聊天工具的示例代码,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-01-01
  • Spring框架中@AliasFor注解详细说明

    Spring框架中@AliasFor注解详细说明

    这篇文章主要给大家介绍了关于Spring框架中@AliasFor注解详细说明的相关资料,@AliasFor是Spring Framework中的一个注解,它用于指定注解属性之间的别名关系,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2024-02-02
  • Java多线程之哲学家就餐问题详解

    Java多线程之哲学家就餐问题详解

    这篇文章主要介绍了Java多线程之哲学家就餐问题详解,文中有非常详细的代码示例,对正在学习java的小伙伴们有非常好的帮助,需要的朋友可以参考下
    2021-04-04
  • 详解JAVAEE——SSH三大框架整合(spring+struts2+hibernate)

    详解JAVAEE——SSH三大框架整合(spring+struts2+hibernate)

    这篇文章主要介绍了详解JAVAEE——SSH三大框架整合(spring+struts2+hibernate),具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-07-07
  • 如何在IDEA Maven项目中导入本地jar包的步骤

    如何在IDEA Maven项目中导入本地jar包的步骤

    今天小编就为大家分享一篇关于IDEA Maven项目中导入本地jar包的步骤,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2018-12-12
  • SpringBoot项目启动报错踩坑实战记录

    SpringBoot项目启动报错踩坑实战记录

    这篇文章主要给大家介绍了关于SpringBoot项目启动报错踩坑的相关资料,文中通过实例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2023-02-02
  • 解决Mybatis-plus自定义TypeHandler查询映射结果一直为null问题

    解决Mybatis-plus自定义TypeHandler查询映射结果一直为null问题

    这篇文章主要介绍了解决Mybatis-plus自定义TypeHandler查询映射结果一直为null问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-07-07
  • Java8加java10等于Java18的版本查看及特性详解

    Java8加java10等于Java18的版本查看及特性详解

    这篇文章主要为大家介绍了Java 8加java10等于Java18的各个版本要点详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-06-06
  • 解决pageHelper分页失效以及如何配置问题

    解决pageHelper分页失效以及如何配置问题

    这篇文章主要介绍了解决pageHelper分页失效以及如何配置问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-04-04
  • JavaWeb中的filter过滤敏感词汇案例详解

    JavaWeb中的filter过滤敏感词汇案例详解

    敏感词、文字过滤是一个网站必不可少的功能,本篇文章主要介绍了JavaWeb中的filter过滤敏感词汇案例,具有一定的参考价值,有需要的可以了解一下,
    2016-11-11

最新评论