2011-03-08 60 views

回答

4
List<String> list = Collections.synchronizedList(new ArrayList<String>()); 
+2

这是一个或多或少的'Vector'插件替代品。但它不一定是正确的使用。 – 2011-03-08 23:01:36

+0

谢谢。我将不得不将一些向量转换为列表。 – VSH3R 2011-03-10 04:44:27

0

阵列,但如果你不知道的大小,使用concurrentmap

+0

假设你想快速随机访问元素(这就是为什么列表将是一个坏主意) – necromancer 2011-03-08 22:22:24

+0

区别是:一个地图提供按键随机访问,一个列表通过索引提供随机访问(或多或少有效)。 – 2011-03-08 22:30:10

+0

你的意思是地图提供O(log(n))访问,而列表提供O(1)?那么它会混淆讨论,将其称为列表 - 它是一个在列表界面中伪装的数组。如果你知道尺寸,阵列显然是最好的,最容易理解的选择。只有当你不知道你选择的尺寸是在地图之间,还是在多线程情况下可提高性能的阵列时,它们会提供不可预测的性能。 – necromancer 2011-03-08 23:10:48

-1

使用列表的实施和他们像

List<?> list = Collections.synchronizedList(new ArrayList<?>()); 
5

对于线程安全的情况下进行同步,使用ArrayList

对于线程安全的情况下,使用什么是最合适你的情况,CopyOnWriteArrayListQueueBlockingDeque等前来咨询更多,我们需要知道你是怎么处理的事情与你的收藏。

我建议不要使用Collections.synchronizedList(...)包装,因为它可能无法很好地扩展(除非您不太在意可扩展性)。但这一切都取决于你的背景。

+0

你能解释为什么'Collections.synchronizedList(...)'不能缩放吗? – corsiKa 2011-03-08 22:28:53

+1

如果您的使用模式为99%读取和1%写入,CopyOnWriteArrayList提供更好的性能(读取COWAL javadoc)。但这一切都取决于使用模式。 – mindas 2011-03-08 22:30:42

+0

够公平 - 一个有趣的课程。我不是100%确定我同意它(即它解决了可能通过使用更好的设计可能解决的问题),但有时理想和实际是两个不同的事情。 +1 – corsiKa 2011-03-08 22:38:29

11

它看起来像使用Java进行编程时,我们不会在涉及到线程时使用向量。

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

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

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

回到你的问题。该方案取决于你的线程正在尝试做的:

  • 如果用例不需要同步所有,使用ArrayList,或LinkedList。您通常会使用这些:

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

  • A CopyOnWriteArrayList列表的优点是它的迭代器支持并发修改...在某种意义上。如果您的应用程序主要执行读取列表,它也会更好地扩展。读操作根本不需要明确同步,通常只需要读取一次volatile一次。但另一面是写操作确实同步,并且比“正常”的价格贵得多。

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


底线是没有一刀切的解决方案。您需要了解应用程序设计的并发特性,并相应地选择您的数据结构。


最后,如果你是编程为Java ME,你可能会坚持使用Vector,这取决于J2ME配置文件,你的目标。

+0

@ 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

相关问题