它看起来像使用Java进行编程时,我们并不想在涉及到线程时再使用Vectors。我可以使用什么来代替Java中的Vector?
使用线程时,应该使用什么类而不是Vector?
import java.util.Vector;
Vector<String> v = new Vector<String>();
它看起来像使用Java进行编程时,我们并不想在涉及到线程时再使用Vectors。我可以使用什么来代替Java中的Vector?
使用线程时,应该使用什么类而不是Vector?
import java.util.Vector;
Vector<String> v = new Vector<String>();
List<String> list = Collections.synchronizedList(new ArrayList<String>());
阵列,但如果你不知道的大小,使用concurrentmap
假设你想快速随机访问元素(这就是为什么列表将是一个坏主意) – necromancer 2011-03-08 22:22:24
区别是:一个地图提供按键随机访问,一个列表通过索引提供随机访问(或多或少有效)。 – 2011-03-08 22:30:10
你的意思是地图提供O(log(n))访问,而列表提供O(1)?那么它会混淆讨论,将其称为列表 - 它是一个在列表界面中伪装的数组。如果你知道尺寸,阵列显然是最好的,最容易理解的选择。只有当你不知道你选择的尺寸是在地图之间,还是在多线程情况下可提高性能的阵列时,它们会提供不可预测的性能。 – necromancer 2011-03-08 23:10:48
使用列表的实施和他们像
List<?> list = Collections.synchronizedList(new ArrayList<?>());
对于线程安全的情况下进行同步,使用ArrayList
。
对于线程安全的情况下,使用什么是最合适你的情况,CopyOnWriteArrayList
,Queue
,BlockingDeque
等前来咨询更多,我们需要知道你是怎么处理的事情与你的收藏。
我建议不要使用Collections.synchronizedList(...)
包装,因为它可能无法很好地扩展(除非您不太在意可扩展性)。但这一切都取决于你的背景。
它看起来像使用Java进行编程时,我们不会在涉及到线程时使用向量。
你需要使用Vector
被认为是在大多数情况下是一件坏事,了解为什么。原因是:
Vector
在每个操作上同步。大多数上下文不需要细粒度的同步,因此这是不必要的性能开销。
Vector.elements()
方法返回一个不具有快速失败语义的Enumeration
。
回到你的问题。该方案取决于你的线程正在尝试做的:
如果用例不需要同步所有,使用ArrayList
,或LinkedList
。您通常会使用这些:
ArrayList
。如果用例需要细粒度同步,Collections.synchronizedList
包装相当于一个Vector
。或者,您可以坚持使用Vector
并避免使用elements()
操作。
A CopyOnWriteArrayList
列表的优点是它的迭代器支持并发修改...在某种意义上。如果您的应用程序主要执行读取列表,它也会更好地扩展。读操作根本不需要明确同步,通常只需要读取一次volatile
一次。但另一面是写操作确实同步,并且比“正常”的价格贵得多。
的另一个问题Vector
和Collections.synchronizedList
包装的是,一些用例需要较粗的同步;例如测试列表的大小并有条件地在单个同步操作中添加元素。 Queue
和Deque
类提供了更高级别的抽象处理这种事情......用于涉及从一个线程异步传递工作到另一个线程的用例。
底线是没有一刀切的解决方案。您需要了解应用程序设计的并发特性,并相应地选择您的数据结构。
最后,如果你是编程为Java ME,你可能会坚持使用Vector
,这取决于J2ME配置文件,你的目标。
@ VSH3R请参阅http://stackoverflow.com/questions/703990/why-is-c-list-not-thread-safe和http://www.ibm。 COM/developerWorks的/ JAVA /库/ J-jtp09263.html。 – tiago2014 2011-03-09 00:01:31
这是一个或多或少的'Vector'插件替代品。但它不一定是正确的使用。 – 2011-03-08 23:01:36
谢谢。我将不得不将一些向量转换为列表。 – VSH3R 2011-03-10 04:44:27