java - 我可以使用什么来代替 Java 中的 Vector?

标签 java multithreading vector thread-safety

<分区>

看起来在用 Java 编程时,当涉及到线程时,我们不应该再使用 Vectors。

在使用线程时我应该使用什么类而不是 Vector?

import java.util.Vector;
Vector<String> v = new Vector<String>();

最佳答案

It looks like when programming in Java we are not suppose to use Vectors anymore when threads are involved.

您需要了解为什么使用Vector 在大多数情况下被认为是一件坏事。原因是:

  • Vector 在每个操作上同步。大多数上下文不需要细粒度同步,因此这是一种不需要的性能开销。

  • Vector.elements() 方法返回一个没有快速失败语义的Enumeration

回到你的问题。备选方案取决于您的线程试图做什么:

  • 如果用例根本不需要同步,请使用ArrayListLinkedList。如果出现以下情况,您通常会使用这些:

    • 列表是线程限制的;即只有一个线程可以访问它。
    • 列表需要粗粒度同步;即执行一系列操作时的独占访问。在这种情况下,您通常会创建一个带有嵌入式(比如)ArrayList 的自定义类,它不会在自定义类 API 中公开。
  • 如果用例需要细粒度同步,Collections.synchronizedList 包装器相当于一个Vector。或者,您可以坚持使用 Vector 并避免使用 elements() 操作。

  • CopyOnWriteArrayList 列表的优点是它的迭代器支持并发修改……在某种意义上。如果您的应用程序主要执行阅读列表,它也可以更好地扩展。读取操作根本不需要显式同步,通常只需要读取一个 volatile 一次。但不利的一面是写操作确实同步,并且比“普通”ArrayList 的开销要大得多。

VectorCollections.synchronizedList 包装器的另一个问题是一些用例需要更粗略的同步;例如测试列表的大小并在单个同步操作中有条件地添加元素。 QueueDeque 类提供了更高级别的抽象来处理这种事情......适用于涉及将工作从一个线程异步传递到另一个线程的用例。


归根结底,没有万能的解决方案。您需要了解应用程序设计的并发特性,并据此选择数据结构。


最后,如果您正在为 Java ME 编程,您可能无法使用 Vector,这取决于您的目标 J2ME 配置文件。

关于java - 我可以使用什么来代替 Java 中的 Vector?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5239066/

相关文章:

java - getStacktrace(),setStackTrace()有什么用?我无法理解这个函数的需要是什么?

c# - C#多线程聊天服务器,处理断开连接

c - (C, pthreads) 让多个线程同步并一起继续

multithreading - FloatToStr/DateToStr 的线程安全性

c++ - 初始化一个字符串 vector ,我已经知道所有值以用 C++ 填充它

c++ - vector 和倾销

haskell - Haskell 中的 INLINE_FUSED 编译指示

java - 从 JAX-RS servlet 动态创建图像

java - 使用较新 Java 的 Elasticsearch 占用的 RAM 比应有的要多

java - Java中的UDP线程无限循环