vector是java中线程安全的动态数组,底层基于object数组,所有核心方法加synchronized实现同步,适合低并发场景但性能低于arraylist。

Vector 是 Java 中自带的线程安全动态数组实现,底层基于 Object 数组,所有关键方法(如 add、get、remove)都加了 synchronized,所以无需额外同步即可在多线程环境下直接使用。
Vector 的基本用法和线程安全性来源
Vector 通过方法级 synchronized 实现线程安全。每次调用 add、get、size 等方法时,都会锁住整个对象实例,保证同一时刻只有一个线程能执行这些操作。
- 初始化:可指定初始容量和扩容增量,例如
new Vector(10, 5)表示初始容量 10,每次扩容增加 5 个位置 - 添加元素:
v.add("item")、v.addElement("item")(后者是遗留方法,功能相同) - 访问元素:
v.get(0)安全,不会出现读到部分写入状态 - 遍历时注意:虽然单个方法安全,但迭代过程(如 for-each 或 Iterator)仍可能因结构修改而抛出 ConcurrentModificationException
Vector 与 ArrayList 的关键区别
Vector 和 ArrayList 接口一致,但行为差异明显:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 同步机制:ArrayList 完全非线程安全;Vector 所有公共方法都是 synchronized,开销更大
- 扩容策略:ArrayList 默认扩容 1.5 倍;Vector 默认翻倍(也可自定义增长量)
- 历史定位:Vector 是 JDK 1.0 就存在的类,属于遗留集合,现代开发更推荐用
Collections.synchronizedList(new ArrayList())或CopyOnWriteArrayList
实际使用中的注意事项
尽管 Vector 天然线程安全,但复杂操作仍需手动同步:
- 复合操作不原子:比如“检查是否存在再添加”(
if (!v.contains(x)) v.add(x))不是原子的,两个线程可能同时通过检查并重复添加 - 迭代需谨慎:建议用
Enumeration(Vector 提供的elements()方法返回线程安全的枚举),或在外围加 synchronized 块保护整个遍历逻辑 - 性能考量:高并发写场景下,Vector 的粗粒度锁会成为瓶颈,此时更适合用
ConcurrentHashMap替代,或选用CopyOnWriteArrayList(适合读多写少)
替代方案推荐(现代写法)
除非维护老代码,否则不建议新项目首选 Vector:
-
Collections.synchronizedList(new ArrayList()):提供与 ArrayList 相同的语义,且同步包装器更明确可控 -
CopyOnWriteArrayList:写操作复制整个数组,读操作无锁,适合读远多于写的场景 - 若需更高并发能力,考虑
ConcurrentLinkedQueue或分段处理 +ReentrantLock细粒度控制
Vector 能用,但不是最优解。理解它怎么安全,更要明白为什么现在通常不用它。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










