看起来,在Java编程中,当涉及到线程时,我们不应该再使用Vectors。
在使用线程时,我应该使用什么类来代替Vector?
import java.util.Vector;
Vector<String> v = new Vector<String>();发布于 2011-03-09 06:41:38
看起来在
中编程时,当涉及到线程时,我们不应该再使用向量了。
您需要理解为什么在大多数情况下使用Vector被认为是一件坏事。原因是:
Vector在每个操作上都会同步。大多数上下文不需要细粒度同步,因此这是不必要的性能开销。Vector.elements()方法返回没有快速失败语义的Enumeration。把这个带回你的问题。替代方案取决于你的线程想要做什么:
ArrayList或LinkedList。您通常会在以下条件下使用:- The list is thread-confined; i.e. only one thread ever can access it.
- The list requires coarse-grained synchronization; i.e. exclusive access while performing a sequence of operations. In this case, you would typically create a custom class with an embedded (say) `ArrayList` that is not exposed in the custom classes API.
Collections.synchronizedList包装器就相当于Vector。或者,您可以坚持使用Vector,并避免使用elements()操作。CopyOnWriteArrayList list的优势在于它的迭代器支持并发修改...从某种意义上说。如果您的应用程序主要执行读取列表,那么它的伸缩性也会更好。读操作根本不需要显式同步,通常只需要读取单个volatile一次。但另一方面,写操作确实是同步的,而且比“普通”ArrayList.的开销要高得多
Vector和Collections.synchronizedList包装器的另一个问题是,一些用例需要更粗略的同步;例如,测试列表的大小和在单个同步操作中有条件地添加元素。Queue和Deque类提供了更高级别的抽象来处理这类事情...用于涉及将工作从一个线程异步传递到另一个线程的用例。
底线是没有万能的解决方案。您需要了解应用程序设计的并发特征,并相应地选择您的数据结构。
最后,如果您正在为Java编程,您可能会坚持使用Vector,这取决于您的目标J2ME概要文件。
发布于 2011-03-09 06:21:21
List<String> list = Collections.synchronizedList(new ArrayList<String>());发布于 2011-03-09 06:22:46
对于线程不安全的情况,请使用ArrayList。
对于线程安全的情况,可以使用任何最适合您的情况,CopyOnWriteArrayList、Queue、BlockingDeque等。要获得更多建议,我们需要知道您是如何处理集合的。
我建议不要使用Collections.synchronizedList(...)包装器,因为它可能伸缩性不够好(除非您不太关心可伸缩性)。但这完全取决于您的上下文。
https://stackoverflow.com/questions/5239066
复制相似问题