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没有快速失败语义的方法.
把它带回你的问题.替代方案取决于您的线程尝试执行的操作:
如果用例根本不需要同步,请使用ArrayList或LinkedList.如果符合以下条件,您通常会使
ArrayList未在自定义类API中公开.如果用例需要细粒度同步,则Collections.synchronizedList包装器等同于a Vector.或者,您可以坚持Vector并避免使用该elements()操作.
从CopyOnWriteArrayList某种意义上说,列表的优点是它的迭代器支持并发修改.如果您的应用程序主要执行读取列表,它也会更好地扩展.读取操作根本不需要显式同步,通常只需要读取volatile一次.但另一方面,写操作会同步,并且比"正常"显着更昂贵ArrayList.
其他问题Vector和Collections.synchronizedList包装是一些用例需要较粗的同步; 例如,测试列表的大小并在单个同步操作中有条件地添加元素.在Queue和Deque类提供处理这种事情......涉及从一个线程异步传递工作,另一个用例更高层次的抽象.
最重要的是,没有一个通用的解决方案.您需要了解应用程序设计的并发特性,并相应地选择数据结构.
最后,如果您使用的是Java ME编程,则可能会遇到使用问题Vector,具体取决于您所针对的J2ME配置文件.
List<String> list = Collections.synchronizedList(new ArrayList<String>());
Run Code Online (Sandbox Code Playgroud)
对于线程不安全的情况,请使用ArrayList.
对于线程安全的情况下,使用什么是最合适你的情况,CopyOnWriteArrayList,Queue,BlockingDeque,等前来咨询更多,我们需要知道你是怎么处理的事情与你的收藏.
我建议不要使用Collections.synchronizedList(...)包装器,因为它可能无法很好地扩展(除非你不太关心可伸缩性).但这一切都取决于你的背景.
| 归档时间: |
|
| 查看次数: |
8146 次 |
| 最近记录: |