<分区>
看起来在用 Java 编程时,当涉及到线程时,我们不应该再使用 Vectors。
在使用线程时我应该使用什么类而不是 Vector?
import java.util.Vector;
Vector<String> v = new Vector<String>();
<分区>
看起来在用 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
。
回到你的问题。备选方案取决于您的线程试图做什么:
如果用例根本不需要同步,请使用ArrayList
或LinkedList
。如果出现以下情况,您通常会使用这些:
ArrayList
的自定义类,它不会在自定义类 API 中公开。如果用例需要细粒度同步,Collections.synchronizedList
包装器相当于一个Vector
。或者,您可以坚持使用 Vector
并避免使用 elements()
操作。
CopyOnWriteArrayList
列表的优点是它的迭代器支持并发修改……在某种意义上。如果您的应用程序主要执行阅读列表,它也可以更好地扩展。读取操作根本不需要显式同步,通常只需要读取一个 volatile
一次。但不利的一面是写操作确实同步,并且比“普通”ArrayList
的开销要大得多。
Vector
和 Collections.synchronizedList
包装器的另一个问题是一些用例需要更粗略的同步;例如测试列表的大小并在单个同步操作中有条件地添加元素。 Queue
和 Deque
类提供了更高级别的抽象来处理这种事情......适用于涉及将工作从一个线程异步传递到另一个线程的用例。
归根结底,没有万能的解决方案。您需要了解应用程序设计的并发特性,并据此选择数据结构。
最后,如果您正在为 Java ME 编程,您可能无法使用 Vector
,这取决于您的目标 J2ME 配置文件。
关于java - 我可以使用什么来代替 Java 中的 Vector?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5239066/
相关文章:
java - getStacktrace(),setStackTrace()有什么用?我无法理解这个函数的需要是什么?
c - (C, pthreads) 让多个线程同步并一起继续
multithreading - FloatToStr/DateToStr 的线程安全性
c++ - 初始化一个字符串 vector ,我已经知道所有值以用 C++ 填充它
haskell - Haskell 中的 INLINE_FUSED 编译指示
java - 从 JAX-RS servlet 动态创建图像