我可以用什么代替Java中的Vector?

VSH*_*H3R 5 java multithreading vector thread-safety

看起来当用Java编程时,我们不想在涉及线程时再使用Vectors.

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

import java.util.Vector;
Vector<String> v = new Vector<String>();
Run Code Online (Sandbox Code Playgroud)

Ste*_*n C 12

看起来当用Java编程时,我们不想在涉及线程时再使用Vectors.

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

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

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

把它带回你的问题.替代方案取决于您的线程尝试执行的操作:

  • 如果用例根本不需要同步,请使用ArrayListLinkedList.如果符合以下条件,您通常会使

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

  • CopyOnWriteArrayList某种意义上说,列表的优点是它的迭代器支持并发修改.如果您的应用程序主要执行读取列表,它也会更好地扩展.读取操作根本不需要显式同步,通常只需要读取volatile一次.但另一方面,写操作会同步,并且比"正常"显着更昂贵ArrayList.

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


最重要的是,没有一个通用的解决方案.您需要了解应用程序设计的并发特性,并相应地选择数据结构.


最后,如果您使用的是Java ME编程,则可能会遇到使用问题Vector,具体取决于您所针对的J2ME配置文件.


Tom*_*icz 5

List<String> list = Collections.synchronizedList(new ArrayList<String>());
Run Code Online (Sandbox Code Playgroud)

  • 这是一个或多或少的插件替代`Vector`.但它不一定是正确的使用方法. (2认同)

min*_*das 5

对于线程不安全的情况,请使用ArrayList.

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

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